2012-01-22 61 views
1

我嘗試查找不同文本中的地址。它工作得很好,除了它也匹配一個單詞後跟一個日期(foobar 22.01.2012 => address:foobar 22) 因此,我想改進的正則表達式的方式,一個街道數字不能後跟「(。 |:)\ d」RegEx與以下不匹配的組

這是我有:

(?<str>\b([a-zA-Z]+-*[a-zA-Z]+(-|\s)*([a-zA-Z]|-)+)\b\.?\s{1})(?<no>\d+(\s?[a-zA-Z])?\b) 

有代表性的文字:

諮詢時間
週一,06.02。直到週五,10.02.2012和
週一,13.02。至星期二,14.02.2012,
每個14.00-15.30點二樓
Am Fasanengarten 12 foobar
Schlossstr。 34

應該找到什麼?
Am Fasanengarten 12
Schlossstr。 34

發現了什麼?
每14
上午Fasanengarten 12
foobar的//爲什麼這是一個匹配?沒有號碼?
Schlossstr。 34

我嘗試了不同的正面/負面lookbehinds/-aheads但沒有運氣。

+0

什麼應該區分」Am Fasanengarten 12 Scholossstr。 34「從文本的其餘部分?它包含字母組成的字母,數字和句點,每個單詞用空格分隔,這也是整個文本的真實情況。應該是重要的 - 我認爲你可以從中吸取教訓:每當你開始寫一個正則表達式時,你需要非常清楚你想要匹配什麼並且不想匹配 –

回答

1

試試這個位置

(?<str>\b(?:[a-zA-Z]+-*[a-zA-Z]+(?:[ \t-])*(?:[a-zA-Z]|-)+)\b\.?\s)(?<no>\d+(?:\s?[a-zA-Z])?\b)(?![.:]\d) 

看到它here on Regexr

負前瞻(?![.:]\d)末保證,不存在 「」並且沒有「:」,之後是\d

foobar //爲什麼這是一場比賽?沒有號碼?
Schlossstr。 34

這是一場比賽,因爲你讓streetname

(?<str>\b([a-zA-Z]+-*[a-zA-Z]+(-|\s)*([a-zA-Z]|-)+)\b\.?\s{1})(?<no>\d+(\s?[a-zA-Z])?\b) 
           ^^ here 

[ \t-]更換這在我的解決方案的話之間\s,這種只允許空間,Tab和連字符。

\s是「空白」,它也包含行制動字符,因爲它匹配foobar,如果你看過該組,就會看到它與地址「foobar Schlossstr」匹配。34「

+0

謝謝很多,stema!現在看起來完美無瑕!:) – user1163680