2012-01-26 19 views
0

(1)先読み正規表現

10digitsのように、上記のパターンを持っているかもしれないテキストで(例えば1235873490 ABCD EFGK)

をsometextウェルこれ

(2)などの非常に類似したパターン

10桁の10進数の数字の(例: 9835873490 VBGF XMF 23.233)

パターン(1)とパターン(2)だけを一致させる正規表現はどのように書くことができますか?

(\d{10})\s*([A-Za-z0-9]+(?:\s+[A-Za-z0-9]+)(?:\s+[A-Za-z0-9]+))\s*(?!(\d+.\d+)) 

をしかし、それは仕事を得ることはできません。

私はこのようなものを使用して、負の先読みを見てきました。何か案は?ところで、私はC + +のブースト::正規表現を使用しています。私は簡単にするため\wにご[A-Za-z0-9]を変更し、それが望んでいるとして、それは何度でも発生することが許さ

(\d{10}   # 10 digits 
    (?:\s+\w+)+) # some text, separated by spaces, 
        # at least one time 
(?!\s*\d+\.\d+) # not followed by a decimal number 

答えて

2

まず、簡単なバージョンで始まります。

しかし、これも2番目の文字列と一致します。最後に23を拾い読みし、その後に10進数( ".23"が続く)がないことを確認して一致します。

これを防ぐために、我々は、それがスペースまたはテキストの最後が続かなければならないと言うことができます:

(\d{10}(?:\s+\w+)+) 
    (?=\s|$)  # it must be followed by a space or end of text 
(?!\s*\d+\.\d+) 

しかし、これはまだ問題があります。さて、それは "... XMF"までマッチしますが、その後に10進数とバックトラックが続きます。 「VBGF」には小数点が続かないため、「VBGF」に戻り、一致します。

これを防ぐために、我々はそれが私たちの主なセクションマッチした時点で、それは後戻りすることはできません正規表現伝えることができます:

(?> # added '?>': not allowed to backtrack once this group is matched 
    \d{10}(?:\s+\w+)+)  
(?=\s|$)(?!\s*\d+\.\d+) 

代わりに、あなたは常にsometextを中に2部があることを知っていればこれもバックトラックを解決します:

(\d{10}(?:\s+\w+){2} # can only occur twice 
    )  
(?=\s|$)(?!\s*\d+\.\d+) 
+0

すごくいいです!どうもありがとう! – Abryan