2014-05-07 73 views
0

我只練我的正則表達式,所以沒有真正的「問題」本身。我不希望建議其他NET方法可以做到這一點。這一切都是我學習的,所以請不要回答,如果它不涉及到正則表達式。謝謝。正看一個頭 - 重複措辭

我給了我自己匹配重複單詞的任務。我對這個詞做了這個硬編碼,但問我自己,如果我們想要所有的單詞。我試圖做的是回到第一組的第一個字,並從那裏去。一整晚都在苦苦掙扎。

一個單詞文本格式的例子是「快速布朗福克斯跳過布朗柵欄」。我們可以看到The和Brown重複了兩次。

表達:

(?i)(?<=\s*\1\.*)\s+(\w+) 

任何提示或建議我要去的地方錯了是很大的。我得到了正則表達式的夥伴,但仍然掙扎着。我正在使用VB.Net

回答

0

你有什麼實際上是一個向後看,而不是一個前瞻。但是,您的方法仍然可行,但在.NET中,後面的引用(\1)需要之後他們所引用的組。這也將有助於周圍使用單詞字符單詞邊界(\b),而不是測試的空白(\s)。

乍一看,好像你也許可以通過將捕獲組的向後看內解決這個問題:

(?i)(?<=\b(\w+)\b.*)\1 

雖然因爲貪婪.*內向後看,第一集團將只匹配字符串中的第一個字(在The)。因此,這實際上等同於(?i)\b(\w+)\b.*\1。使其非貪婪(.*?)將導致其只匹配相同字的兩個連續的實例。

那麼解決的方法是簡單地使用前瞻這樣的:

(?i)\b(\w+)\b(?=.*\1) 

和公正的情況下,不管是什麼原因,你需要獲得第二個字,而不是第一個,這是可以實現的通過簡單地把第二個捕獲組前瞻

進一步閱讀裏面

+0

全面披露:我問一個問題](http://stackoverflow.com/questions/18344034/do-backreferences-need-to-come-after-the-group-they-reference)關於這個話題,但我不覺得這個問題是重複的,因爲它似乎是在詢問更普遍的問題。 –

1

您在代碼中使用的內容不是「積極向前」,而是「向後看」。

我對vb.net沒有經驗。但並非所有的正則表達式引擎支持具有動態長度向後看(如.*

但是你的問題可以通過積極的前瞻來解決:

(\b\w+\b)(?=.*?\1) 

我沒有Windows,只是使用grep的-P嘗試(PCRE)和-i(忽略大小寫)選項:

kent$ echo "The quick Brown Fox Jump over the Brown fence."|grep -iPo '(\b\w+\b)(?=.*?\1)' 
The 
Brown 
+0

+1的答案和*** 「肯特@世界$男人生活 終身無需人工錄入」 ***;) –