2012-07-02 62 views
0

我試圖建立一個正則表達式,我被要求過濾字符串像Recusive排序正則表達式

country:India provinces:Uttranchal city:Dehradun zip_code:12345

從字符串這樣

keyword: one two three country:India provinces:Uttranchal city:Dehradun zip_code:12345 filter: myparameter

現在的我編寫了基本的正則表達式,如

country:\w+|provinces:\w+|city:\w+|zip_code:\w+ 

哪種類型的做的工作對我來說如果countryprovincescity是單個單詞

但如果他們不 例如

keyword: one two three country:United-States provinces:Manhattan city:New-York zip_code:12345 filter: myparameter

以上reqex只是沒有因爲非限制的工作單詞字符如-

你可以假設國家,省份或城市,並有多個加入的詞-

country:United-States-of-America provinces:Washington-Dc city:New-York-West

等 等...

所以-\w+是一種具有0以上occurence遞歸模式的任一countryprovincescity或全部

現在我也嘗試建立一個正則表達式同樣是這樣的

(country:\w+(-\w+)*)|(province:\w+(-\w+)*)|(city:\w+(-\w+)*)|(zip_code:\w+(-\w+)*)

這雖然比賽 但你可以在rubular screenshot看到連接,它也呈現非公認輸出和零

我要的是避免non-acceptednil輸出,導致匹配問題分離的結果,當從給定的輸入字符串所需的字符串或可有人建議我比這

+1

正則表達式不能以直接幫助你的方式工作。如果您使用的是支持正則表達式的編程語言,那麼對於您想要執行的操作,有一些非常簡單的解決方案。但是,你在用什麼語言工作?紅寶石?如果您告訴我們我們可以提供更準確的解決方案。 –

+0

@AndrewMartinez是紅寶石 – Ratatouille

回答

0

如果要匹配一組的一個或多個字母和破折號,你可以用括號來表示character set[\w\-]+

country:[\w\-]+|provinces:[\w\-]+|city:[\w\-]+|zip_code:[\w\-]+ 

兩行示例中的Python:

>>> s = "keyword: one two three country:United-States provinces:Manhattan city:New-York zip_code:12345 filter: myparameter" 
>>> print re.findall("country:[\w\-]+|provinces:[\w\-]+|city:[\w\-]+|zip_code:[\w\-]+", s) 
['country:United-States', 'provinces:Manhattan', 'city:New-York', 'zip_code:12345'] 
+0

它幫助謝謝 – Ratatouille

0

(...)是捕獲組更好的正則表達式。紅寶石(如果這是你使用的是什麼),也支持非捕獲組(?:...),所以我想你想:

(country:\w+(?:-\w+)*)|(province:\w+(?:-\w+)*)|(city:\w+(?:-\w+)*)|(zip_code:\w+(?:-\w+)*) 

甚至:

(country:\w+(?:-\w+)*|province:\w+(?:-\w+)*|city:\w+(?:-\w+)*|zip_code:\w+(?:-\w+)*) 

,如果你想他們都在捕捉組1 。

+0

您的正則表達式工作奇怪我是多麼接近答案 – Ratatouille

+0

謝謝你的答案 – Ratatouille