0

文字列内の単語を前方および後方に一致させようとしていますが、すべての一致をキャッチしていません。たとえば、文字列「AAABAAABAAA」で単語「AB」を検索する場合、正規表現 /AB|BA/ を作成して使用しますが、2 つの「AB」部分文字列のみに一致し、「BA」部分文字列を無視します。

iPhone で RegexKitLite を使用していますが、これはより一般的な正規表現の問題だと思います (オンラインの正規表現テスターでも同じ動作が見られます)。それにもかかわらず、一致を列挙するために使用しているコードは次のとおりです。

[@"AAABAAABAAA" enumerateStringsMatchedByRegex:@"AB|BA" usingBlock:
 ^(NSInteger captureCount,
   NSString * const capturedStrings[captureCount],
   const NSRange capturedRanges[captureCount],
   volatile BOOL * const stop) { 
     NSLog(@"%@", capturedStrings[0]);
 }];

出力:

AB
AB
4

3 に答える 3

1

どのオンライン テスターを試したかはわかりませんが、http://www.regextester.com/ (たとえば) では、複数の一致に対して同じ文字は考慮されません。この場合、ABA は AB と一致するため、B は BA と一致するとは見なされません。RegexKitLite が同様に実装されているのは、純粋に推測です。

ミラーリングされたバリアントを考慮しなくても、元の検索文字列がそれ自体と重複する可能性があります。たとえば、ABCA|ACBA in ABCABCACBACBA を検索すると、4 つの一致のうち 2 つが得られ、どちらの方向の検索も同じになります。

一致を段階的に見つけることは可能ですが、おそらく RegexKitLite では不可能です

于 2011-06-06T19:11:25.280 に答える
1

私は、それは 1 つのターンでは不可能だと思います。正規表現は指定されたパターンに一致し、一致した文字を「食べます」。したがって、最初に見つかったパターンで検索AB|BAすると、正規表現は 3 番目のパターンで検索を続けます。ABAABA

|そのため、同じ正規表現で演算子を使用して重複するパターンを見つけることはできません。

于 2011-06-06T19:33:57.570 に答える
0

文字列を逆にして2回テストすることなく、あなたが求めていると思うことを正確に達成する方法がわかりません。

ただし、それはあなたが正確に何を求めているかによると思います。パターンが文字列の前後に発生するかどうかを判断するだけで、どのように発生するかを判断しようとしている場合は、次のようにすることができます。

ABA?|BAB?

?、 の両側の最後の文字をオプションにします|。の場合は2 回AAABAAABAAA検索されます。ABAの場合は、の場合はがAB見つかります。ABBABA

ここにテストケースがあります... http://regexhero.net/tester/?id=a387ae0a-1707-4d9e-856b-ebe2176679bb

于 2011-06-06T18:02:46.523 に答える