我對RegEx表達式很恐怖,而且我經常不足以讓我記住兩次使用之間的語法。當字符串出現兩次時匹配的正則表達式
我正在使用grepWin來搜索我的文件。我需要做一個搜索,將返回給定字符串兩次的文件。
因此,舉例來說,如果我是對單詞搜索「如何做」,那麼文件中的一個不匹配:
你好
今天你怎麼樣?
,但文件中的兩個會:
你好
今天你怎麼樣?我很好,你好嗎?
任何人都知道如何製作RegEx來匹配它?
我對RegEx表達式很恐怖,而且我經常不足以讓我記住兩次使用之間的語法。當字符串出現兩次時匹配的正則表達式
我正在使用grepWin來搜索我的文件。我需要做一個搜索,將返回給定字符串兩次的文件。
因此,舉例來說,如果我是對單詞搜索「如何做」,那麼文件中的一個不匹配:
你好
今天你怎麼樣?
,但文件中的兩個會:
你好
今天你怎麼樣?我很好,你好嗎?
任何人都知道如何製作RegEx來匹配它?
這比我原先想象的要困難得多這將是,需要可變長度的回顧後,這grepWin不支持......
這個表達式:
(?<!blah.{0,99999})blah(?=.*?blah)(?!.*blah.*blah)
在Eclipse中成功使用,使用「搜索>文件」對話框中排除的文件包含一個和三個blah
實例,幷包含具有兩個blah
兩個實例的文件。
Eclipse不允許.*
倒在後面,所以我用.{0,99999}
代替。
使用正確的工具是可能的,但讓它與grepWin一起工作並不美妙(參見上面的答案)。您可以使用其他工具(如Eclipse)以及之後您想對文件做什麼?
如果lookbehinds是一個問題,我只用瞭望遠鏡。 – Wiseguy
是的 - 一旦我在要求的產品中測試@ VMykyt的解決方案並且它工作(尤其是沒有OP的任何明顯的興趣),我一直沒有打擾過。當我最初開展工作時,我的大腦不知何故暫時失去了開始行或字符串錨點的想法,這應該使它不可能沒有後視:D –
@Wiseguy我喜歡你的解決方案使用整體但儘管如此,儘管不會太難添加,但沒有人說明OP可能希望只匹配具有兩個實例的文件,但允許「榴彈炮」或「以某種方式」,甚至「淋浴」任何次數 –
我不知道grepWin支持什麼,但是這裏是我想出來的東西,讓它匹配兩次。
/^((?!how).)*how((?!how).)*how((?!how).)*$/
說明:
/^ # start of subject
((?!how).)* # any text that does not contain "how"
how # the word "how"
((?!how).)* # any text that does not contain "how"
how # the word "how"
((?!how).)* # any text that does not contain "how"
$/ # end of subject
這可以確保您發現兩個「如何」 S,而是「如何」之間的文本,要麼他們一邊不包含「如何」。
當然,您可以用任何字符串替換表達式中的「how」。
如果你想只寫搜索表達式 「簡化」 了兩次,你可以這樣使用反向引用:
/^(?:(?!how).)*(how)(?:(?!\1).)*\1(?:(?!\1).)*$/
說明:
我加?:
,使負面看法'的文字無法捕捉。然後我在常規的how
周圍添加了括號,以便創建一個捕獲子模式(第一個也是唯一一個)。
我必須在第一個預見中再次包含「how」,因爲這是一個負向預測(意味着任何捕獲將不會包含「how」),並且捕獲的「how」在此時尚未捕獲。
如果搜索字符串必須是變量,那麼使用正則表達式是不可能的。您需要將其與腳本語言結合使用。如果它不需要變量,那麼這個正則表達式就會這樣做:'你好嗎?*你好嗎? – Jeff
@Jeff可以在JavaScript正則表達式中返回匹配的組:'/(abc)\ 1 /'匹配'abcabc',但不匹配'abc'。 –
只有當「how」出現兩次時才必須匹配?如果出現三次或更多次,該怎麼辦? – Wiseguy