2017-02-02 6 views
1

一致したいパターンは、長さnのシーケンスで、nはシーケンスの直前です。nが固定されていないn回に一致する正規表現

たとえば、入力が「1aaaaa」の場合、最初の数字が1文字だけ一致すると指定するので、1文字「a」と一致させたいと思います。

同様に、入力が "2aaaaa"の場合、最初の2文字 "aa"は一致させたいが、残りの2文字は一致しない。

私はa{1}a{2}が「a」と1〜2回一致することを理解しています。しかし、nが固定されていないa{n}とどのようにマッチするのですか?

正規表現を使用してこのタイプの一致を実行できますか?

+0

あなたはどのような言語/ツールを使用していますか? –

+3

最初の文字に基づいて正規表現を動的に生成する必要があります。正規表現だけではこれを行うことはできません。 – 4castle

+0

@TimBiegeleisenあらゆる言語。 Perl、Python、Java、Javascriptのいずれかのソリューションをお持ちの方は参考になります。ちょうど一般的な考えをしたい。 – zhanxw

答えて

1

これは繰り返し番号で使用できます。

import re 

a="1aaa2bbbbb1cccccccc4dddddddddddd" 

for b in re.findall(r'\d[a-z]+', a): 
    print b[int(b[0])+1:int(b[0])+1+int(b[0])] 

出力:

a 
bb 
c 
dddd 
+0

ありがとうございます。しかし、私の質問はこれより複雑です。 – zhanxw

+0

@zhanxw \t今はどうですか?私の場合は – MYGz

+0

、aは1行です。 'a =" 1aaaaa2bbbbbbbbbbb3cccccccccc4ddddddddddd "'。番号の位置は固定されていません。あなたのコードをありがとう。 – zhanxw

0

私はJavaで行っているが、それはあなたのプログラムの中で起こって得るのを助けます。

ここでは、与えられた入力文字列から サブ文字列として 最初文字を選択し、それに応じて文字列に一致するように、あなたの正規表現でそれを使用することができます。

public class DynamicRegex { 

    public static void main(String args[]){ 
     Scanner scan = new Scanner(System.in); 

     System.out.println("Enter a string: "); 
     String str = scan.nextLine(); 

     String testStr = str.substring(0, 1); //Get the first character from the string using sub-string. 

     String pattern = "a{"+ testStr +"}"; //Use the sub-string in your regex as length of the string to match. 

     Pattern p = Pattern.compile(pattern); 

     Matcher m = p.matcher(str); 

     if(m.find()){ 
      System.out.println(m.group()); 
     } 
    } 

}

+0

ありがとうございます。数字は最初の文字ではなく、長さが異なる場合があります(例:1a、2aa) 実際、入力文字列は質問に記載されている文字列よりも複雑な場合があります。入力= "1a..2aa ..... 1aaa ..."。私は "1a"、 "2aa"、 "1a"に一致させたい。 そのため、私はそれらのすべてに一致する正規表現を探しています。 – zhanxw

関連する問題