2010-11-22 11 views
2

数字の文字列をスキャンしようとしています。番号は "v/v。/ vol/vol。"の後にすることはできません。括弧の中に入れることはできません。ここに私が持っているものがあります:ICU正規表現を使用してカッコ内にない数字を見つける正規表現

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]); 

怒って、これは動作しません。 。 -

(?<!v|vol|vol\\.|v\\.)小文字を区別しない正規表現のケースを作る - V/V /容量/容量に対して負のルックの背後にあるアサーション

(?i):私の正規表現は、次の4つの部分に分けることができます。

\\d{1,4} - 探している数字は、1〜4桁です。

(?![\\(]{0}.*\\)) - 負の先読みアサーション:。。私は見てビハインドアサーションを取る場合には、その前に(がありますしない限り、数は、a)は、先行することはできません

はMaddeningly、それが動作ここでの問題は何ですか?私はICUの正規表現の構文を使用しRegexKitLiteを、使用してい

答えて

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}.*\\)) 
+0

私は、Javaの 'Pattern'クラスの可変幅のルック・バックがパフォーマンスに重大な影響を与える可能性があることに気付きました。私はICUライブラリを使用していませんが、ちょうどそれらの上に垂れ流してしまったので、まだそこには本当かどうかはわかりません。 – tchrist

+0

lookbehindの問題に関する正しい権利 - 私はドキュメントを誤読しました。しかし、それはカッコ内にない数字を拾い上げることができません。括弧内の論理に欠陥がありますか?例:@ "703(1234)の文字列(ここでは2番目の単語)(複数の文字)" –

1

最後に、この正規表現になってしまった:

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

負ルックの背後に変更する必要が。すべてのテストをパスします。私のNLBの位置付けが間違っていることを確認してくれたAlexに感謝します。

関連する問題