2017-08-17 57 views
-1

我有這個正則表達式可以掃描文字very(?i)(?:^|\W)(very)[\W$]它的工作原理。我的目標是升級它,並避免在引用中單獨或作爲較長塊的一部分進行匹配。複雜的正則表達式匹配任何不在引號

現在,我有這個其他正則表達式匹配任何不在裏面的引號:(?<![\S"])([^"]+)(?![\S"])這也適用。

我的問題是,我似乎無法將它們結合起來。例如字符串:

Fred Smith very loudly said yesterday at a press conference that fresh peas will "very, very defintely not" be served at the upcoming county fair。在這一點上,我們有very 3個實例,但我只對匹配第一個和忽略整個史密斯報價感興趣。

+0

設置它的賞金。我希望看到如何匹配一個字符串,該字符串不會在奇數引號之後和至少一個引號之前出現。 – Aydin4ik

回答

0

你所描述的是用正則表達式處理棘手的問題。很難確定你是否在報價單內。你的第二個正則表達式是無效的,因爲它只忽略了直接在引用右邊的第一個very,並且仍然匹配第二個正則表達式。

this answer吸取靈感,依次引用另一個描述如何regex match a pattern unless ...我可以捕捉你想要的匹配的答案。

基本思想是使用替代|並匹配所有你不想要的東西,然後最後匹配(並捕獲)你在最後一個子句中要做的事情。事情是這樣的:

"[^"]*"|(very) 

我們匹配引述第一條中的字符串,但我們並不第二子句中捕捉它們放在一個組,然後我們匹配(和捕獲)字very。您可以在捕獲的組中找到該匹配項。您如何引用捕獲的組取決於您的正則表達式環境。

對於測試用例,請參閱此regex101 fiddle

+0

我看到裏面的單詞仍然被匹配。我需要忽略那裏的任何東西。 –

+0

這種方法的工作方式是捕獲組。你主動匹配引用的字符串,但你沒有捕獲它(沒有捕獲組),你只使用捕獲組來「非常」,然後你可以引用它。引用捕獲組取決於你的正則表達式環境,但我不確定你在使用什麼。 – Matt

0

此正則表達式

(?i)(?<!(((?<DELIMITER>[ \t\r\n\v\f]+)(")(?<FILLER>((?!").)*))))\bvery\b(?!(((?<FILLER2>((?!").)*)(")(?<DELIMITER2>[ \t\r\n\v\f]+)))) 

可在兩個條件下工作:

  • 你的正則表達式引擎允許無限回顧後
  • 引號用空格分隔

試試它http://regexstorm.net/tester