2012-12-19 61 views
1

嗨,我想匹配字符串的第二次出現,但只是爲了匹配,而不是其他任何東西,所以在我的示例中,方括號內的word1意味着應該是匹配的。匹配線上任何位置的第二組字符?

word1 tex text [word1] text 
word1 [word1] word1 
word1 [word1] 
word1 text [word1] 

請你能幫助我,我正在學習正則表達式,我無法在網上找到答案,也沒有在書中找到答案。我正在使用一個記事本編輯器,它接受.net正則表達式兼容或perl。

謝謝

+2

「word1 text text1」會匹配什麼? –

+0

嘿,我試過了,與我的文本編輯器一起工作,但是隻是從目標匹配的第二次發生中選擇。 (?:????(<= *(<=({(A | B)}))*(=({(A | B)}))*)(?:。(?!。 {)){(a | b)}) – alex

+0

...沒有冒犯,但這是一個醜陋的正則表達式。想象一下,如果你想匹配的部分有括號。 – jpmc26

回答

1

這取決於你想要做什麼與比賽。

如果你只想得到一個布爾值,你是否有匹配與否,這是簡單簡單地看看你有沒有這個詞兩次:

word1.*word1 

.*匹配任意數目的字符,所以它只是查找兩次之間的任何詞。

如果您想替換它,請保持簡單。只需更換一切:

word1(.*?)word1 

如需更換,你需要添加??使*免於貪婪,因此當它有三個時,它不會吃第二次出現的word1。

更換匹配

word1\1newword 

\1表示的括號內的一切(即,一切拾起.*?)。 \可能會有所不同,具體取決於您使用的正則表達式引擎。例如,Powershell(我認爲.NET)使用$而不是\

基本上,想想你想對結果做什麼。問問自己是否有更大的字符串可以匹配,而不是只是第二次出現。

+0

我認爲你是對的,我試圖達到的是在我的regexbuddy中選擇word1,而且我越來越複雜,看看我做了什麼(?:(?<=。*?(?<=( {(a | b)}))。*?(?=({(a | b)}))。*)(?:(?!。{)){(a | b)}) word1的第二個實例,但從那裏剩下的事件被選中。但我想你是對的,如果我想要第三次發生,我會做類似word1。* word1。*(word1)這樣的方式得到選擇,謝謝 – alex

+0

你打算用什麼正則表達式?或者這只是學習的習慣?如果是練習,我不會試圖解決這個特殊的問題。我使用正則表達式的絕大多數是用於替換,其他常用用於驗證(用戶數據需要匹配某種模式)。我並不是非常有經驗的,但是我還沒有碰到一個我真正需要某種backref檢查的情況。如果你只是想學習,學習一些基礎知識,並在實際需要時學習其餘知識。 YAGNI。 – jpmc26

+0

如果您嘗試替換第三個匹配項,您可以這樣做:用'word1 \ 1word1 \ 2word1'替換'word1(。*?)word1(。*?)word1'。 – jpmc26

1

只匹配出現的背後別的東西,你將需要使用lookbehind東西。要匹配的東西,出現了兩次,你可以使用一個matching group and a backreference

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

然而,回顧後的複雜性是有限的,大多數語言,所以我不知道這是有效的。

+0

謝謝,我面臨的問題是我使用你說的話,但總是選擇這個詞,如果再次出現在同一行,我試圖禁用其餘的出席,但像(?=。* $ )不會禁用字符串的其餘部分,你知道一種方法來實現這個嗎? – alex

+0

請勿使用* global *標誌?你是否一行一行匹配,或者正則表達式是否需要進行行分割? – Bergi

+0

我正在使用文本編輯器,不使用腳本,逐行處理它我有這個(?:(?<=。*?(?<=({(a | b)}))。*?(?= ({(a | b)}))。*)(?:(?!。{)){(a | b)})但是這似乎選擇除了第一次出現以外的同一行中的所有出現,想避免它。只是選擇第二個詞的任何想法? – alex

相關問題