2

与えられた文字列をスキャンして数値を探しています。「v/v。/vol/ vol。」の後に数字を入れたり、括弧内に入れたりすることはできません。これが私が持っているものです:

NSString *regex = @"(?i)(?<!v|vol|vol\\.|v\\.)\\d{1,4}(?![\\(]{0}.*\\))";
NSLog(@"Result: %@", [@"test test test 4334 test test" stringByMatching:regex]);
NSLog(@"Result: %@", [@"test test test(4334) test test" stringByMatching:regex]);
NSLog(@"Result: %@", [@"test test test(vol.4334) test test" stringByMatching:regex]);

腹立たしいことに、これは機能しません。私の正規表現は4つの部分に分けることができます:

(?i)-正規表現の大文字と小文字を区別しない

(?<!v|vol|vol\\.|v\\.)-v/v。/vol/volのネガティブルックビハインドアサーション。

\\d{1,4}-私が探している番号、1〜4桁。

(?![\\(]{0}.*\\))-否定的な先読みアサーション:(の前に()がない限り、数値を)の前に置くことはできません。

不思議なことに、私が後ろ向きのアサーションを取り除けば、それは機能します。ここでの問題は何ですか?ICUの正規表現構文を使用するRegexKitLiteを使用しています。

4

2 に答える 2

3

あなたのnegative lookbehind位置が間違っています。ルックビハインドは入力位置を変更しません。式negative lookbehindの後に来る必要があります。\d{1,4}

(?i)\\d{1,4}(?<!v|vol|vol\\.|v\\.)(?![\\(]{0}.*\\))

または、を使用しnegative lookaheadて同じ目的を達成します。

(?i)(?!v|vol|vol\\.|v\\.)\\d{1,4}(?![\\(]{0}.*\\))
于 2010-11-22T20:56:24.883 に答える
1

最終的にこの正規表現になりました:

(?i)\\d{1,4}(?<!v|vol|vol\\.|v\\.)(?![^\\(]*\\))

ネガティブな後読みを変える必要がありました。私のすべてのテストに合格します。私のNLBの位置が間違っていることを特定してくれたAlexに感謝します。

于 2010-11-23T18:15:17.163 に答える