嗨,我想匹配字符串的第二次出現,但只是爲了匹配,而不是其他任何東西,所以在我的示例中,方括號內的word1意味着應該是匹配的。匹配線上任何位置的第二組字符?
word1 tex text [word1] text
word1 [word1] word1
word1 [word1]
word1 text [word1]
請你能幫助我,我正在學習正則表達式,我無法在網上找到答案,也沒有在書中找到答案。我正在使用一個記事本編輯器,它接受.net正則表達式兼容或perl。
謝謝
嗨,我想匹配字符串的第二次出現,但只是爲了匹配,而不是其他任何東西,所以在我的示例中,方括號內的word1意味着應該是匹配的。匹配線上任何位置的第二組字符?
word1 tex text [word1] text
word1 [word1] word1
word1 [word1]
word1 text [word1]
請你能幫助我,我正在學習正則表達式,我無法在網上找到答案,也沒有在書中找到答案。我正在使用一個記事本編輯器,它接受.net正則表達式兼容或perl。
謝謝
這取決於你想要做什麼與比賽。
如果你只想得到一個布爾值,你是否有匹配與否,這是簡單簡單地看看你有沒有這個詞兩次:
word1.*word1
的.*
匹配任意數目的字符,所以它只是查找兩次之間的任何詞。
如果您想替換它,請保持簡單。只需更換一切:
word1(.*?)word1
如需更換,你需要添加?
。 ?
使*
免於貪婪,因此當它有三個時,它不會吃第二次出現的word1。
更換匹配
word1\1newword
的\1
表示的括號內的一切(即,一切拾起.*?
)。 \
可能會有所不同,具體取決於您使用的正則表達式引擎。例如,Powershell(我認爲.NET)使用$
而不是\
。
基本上,想想你想對結果做什麼。問問自己是否有更大的字符串可以匹配,而不是只是第二次出現。
我認爲你是對的,我試圖達到的是在我的regexbuddy中選擇word1,而且我越來越複雜,看看我做了什麼(?:(?<=。*?(?<=( {(a | b)}))。*?(?=({(a | b)}))。*)(?:(?!。{)){(a | b)}) word1的第二個實例,但從那裏剩下的事件被選中。但我想你是對的,如果我想要第三次發生,我會做類似word1。* word1。*(word1)這樣的方式得到選擇,謝謝 – alex
你打算用什麼正則表達式?或者這只是學習的習慣?如果是練習,我不會試圖解決這個特殊的問題。我使用正則表達式的絕大多數是用於替換,其他常用用於驗證(用戶數據需要匹配某種模式)。我並不是非常有經驗的,但是我還沒有碰到一個我真正需要某種backref檢查的情況。如果你只是想學習,學習一些基礎知識,並在實際需要時學習其餘知識。 YAGNI。 – jpmc26
如果您嘗試替換第三個匹配項,您可以這樣做:用'word1 \ 1word1 \ 2word1'替換'word1(。*?)word1(。*?)word1'。 – jpmc26
只匹配出現的背後別的東西,你將需要使用lookbehind東西。要匹配的東西,出現了兩次,你可以使用一個matching group and a backreference:
/(?<=\b\1\b.*?)\b(\w+)\b/
然而,回顧後的複雜性是有限的,大多數語言,所以我不知道這是有效的。
謝謝,我面臨的問題是我使用你說的話,但總是選擇這個詞,如果再次出現在同一行,我試圖禁用其餘的出席,但像(?=。* $ )不會禁用字符串的其餘部分,你知道一種方法來實現這個嗎? – alex
請勿使用* global *標誌?你是否一行一行匹配,或者正則表達式是否需要進行行分割? – Bergi
我正在使用文本編輯器,不使用腳本,逐行處理它我有這個(?:(?<=。*?(?<=({(a | b)}))。*?(?= ({(a | b)}))。*)(?:(?!。{)){(a | b)})但是這似乎選擇除了第一次出現以外的同一行中的所有出現,想避免它。只是選擇第二個詞的任何想法? – alex
「word1 text text1」會匹配什麼? –
嘿,我試過了,與我的文本編輯器一起工作,但是隻是從目標匹配的第二次發生中選擇。 (?:????(<= *(<=({(A | B)}))*(=({(A | B)}))*)(?:。(?!。 {)){(a | b)}) – alex
...沒有冒犯,但這是一個醜陋的正則表達式。想象一下,如果你想匹配的部分有括號。 – jpmc26