2017-01-17 23 views
1

我想允許(this is)?.??.??(an)?.??.??(example sentence)正則表達式中每個組之間的0到2個字符。它應該匹配下面字符串中的粗體文本:使用可選組獲得最短匹配的問題

等等等等。一個例句
等等等等。 這是一個例句
東西的東西,例句

現在,在第一個例子中,與之匹配的是ah. example sentence。我認爲給「」添加2個問號。「將意味着正則表達式引擎將喜歡匹配0個字符。

我在MS Word的VBA中使用正則表達式,由CreateObject("vbscript.regexp")實現,據我瞭解,它使用VBScript正則表達式的味道,據我瞭解它與JavaScript的味道相同。

+0

@ wiktor-stribiżew爲什麼這是重複的?據我所知,我故意使用非貪婪,但得到一個貪婪的匹配。這在鏈接問題中沒有解決。 –

+1

你似乎誤解了貪婪和懶惰的量詞是如何工作的。鏈接的線程處理該問題。量詞不會影響找到匹配的地方。正則表達式引擎從左向右解析文本。一旦它可以將一部分文本與一個模式相匹配,它就會。 –

+0

(this is)。*?(an)。*?(例句) –

回答

3

當搜索0020002101應該2.??.??.??101不喜歡210120002101

正則表達式egine不能「偏好」任何東西。它從左到右匹配。找到2(第一個2)後,它將開始匹配後續的子模式,並且當找到匹配項時,它將被返回。

在你的情況,你需要使用.{0,2}可選組內,

(this is.{0,2})?(an.{0,2})?(example sentence) 
     ^^^^^^  ^^^^^^ 

regex demo

如果可選字符串的順序是非常重要的,讓他們嵌套:

(this is.{0,2}(an.{0,2})?)?(example sentence) 

another regex demo。這個正則表達式只有匹配an後面的0到2個字符,只有在this is之前找到0到2個字符。

+0

謝謝。這很明顯地說明了一些事情。 –

+0

正在嘗試一下這個,修改原來的正則表達式爲'(this is)??。??(an)??。??。(例句)'我只希望**例句**匹配但是... [regex101](https://regex101.com/r/ONhZRD/5)。前兩組以任何方式匹配。任何想法爲什麼? – ClasG

+0

提示:在regex101.com切換到PCRE正則表達式,然後單擊* regex調試器*。您將看到這些NFA正則表達式引擎非常常見的匹配內部結構。預計您的比賽。如果您需要避免返回匹配,則必須使用限制匹配上下文的lookarounds/zero-width斷言,並且不會將匹配的文本與匹配值一起返回。 –