2015-12-03 211 views
2

我堅定地使用正則表達式。我下面的正則表達式匹配所有我想:正則表達式匹配任何其他正則表達式不匹配

#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?

很長 - 對不起。它用於解析任意對象的格式字符串。它使我能夠指定一個屬性(例如IntValue)並將可選的子格式轉發給它。

它相匹配的#接着任選的非捕獲圖案?:,接着任選的「選項」圖案(?r)(?a-r)。然後是屬性名稱後跟一對[]

對於以下輸入:

Int: #IntValue Bool: #BoolValue[]Word Str: '#StrValue' Double: #DoubleValue[#.00] #(?r)Bar[#(?r)StrValue[#Length]]

它匹配:

  • #IntValue
  • #BoolValue []
  • #StrValue
  • #DoubleValue [#00 ]
  • #(?r)Bar [#(?r)StrValue [#Length]]

好。

但現在我需要所有其他的東西。我希望它在同一個正則表達式中能夠對所有匹配進行foreach(我可以通過檢查idplain是否具有捕獲來決定是否有這種情況)。

默認模式做的就是:((?!<regex that matches what you want>).)*

在我的情況下,將看起來像(圖案:<REG>|(?<plain>(?:(?!<REG>).)+)) 什麼resuls在那巨大的正則表達式(whitch maches完美):

(?:#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?)|(?<plain>(?:(?!(?:#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?)|(?<plain>(?:(#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?).)+)).)+)

Puh。它做它應該但是...

是否有任何其他方式來匹配所有不匹配的先前的正則表達式部分?

這是明確的嗎?

+0

爲什麼不只是'!regex.IsMatch(input);'? – Rob

+0

看起來沒有辦法,除非你想嘗試PCRE.net,在那裏你可以使用PCRE'(* SKIP)(* F)'動詞。不過,這將是一個漫長的正則表達式。也許,你可以匹配第一種類型的子串,然後使用它們來分割剩下的東西?因爲我解析了一個字符串,所以@Rob是 –

+1

。我需要所有的部分。有些部件符合我的財產模式。但現在我需要所有其他的東西。 'Regex.IsMatch'只會檢查是否匹配。是的,有多個匹配。整個字符串將被匹配。 'regex.IsMatch'不會幫助我。 –

回答

2

你很幸運:你的正則表達式以主角字符開頭,即#。我們可以利用這一點。

添加模式的替代品:|[^#]+。這將消耗除#個字符以外的所有內容,將特殊情況從#開始,保留到模式的第一部分。一個#角色因此總是會開始一場新的比賽。

仍然有輕微的陷阱:你有一個非可選id組由兩個\b錨在第一部分所包圍,這意味着如果你在輸入字符串#未後面有一個字母(讓我們說些什麼如foo#!bar),#也不會與模式的第二部分匹配。

解決此問題的一個簡單方法是在模式末尾使用|[^#]+|#來解釋此邊緣情況。只有第一種情況失敗時,第三種#情況纔會匹配。

+0

_之後的所有內容都是可選的._否。「id」不是可選的,但您的解釋也適用。 –

+0

哦,對,我一定見過一個不在那裏的'?' –