正则表达式的左侧仅(.NET)贪(regular expression greedy on left

2019-09-21 22:26发布

我想两个字符串之间捕获匹配。

例如,我在寻找一个Q和XYZ之间出现的所有文字,使用“最快”的比赛(不继续向外扩张)。 此字符串:

马戏团Q你好今天Q SOMETEXT XYZ是一天XYZ XYZ没关系

应该返回:

Q SOMETEXT XYZ

但是,相反,它返回:

Q你好Q SOMETEXT XYZ

下面是我使用的表达:?Q * XYZ

这太离谱了回到左边。 当我用问号星号后,它的工作就骑边罚款。 我怎样才能做左侧相同,并停止一次,我打的是左一Q,使得它的工作方式相同右侧作品? 我试过问号和其他符号http://msdn.microsoft.com/en-us/library/az24scfc.aspx ,但有些事情我只是没有搞清楚。

我是一个正则表达式新手,所以有这方面的帮助将不胜感激!

Answer 1:

好了,不贪婪的匹配工作 - 它得到满足正则表达式最短的字符串。 你必须记住的是, 正则表达式是左到右的过程 。 因此,它的第一Q相匹配,然后得到的字符,随后的XYZ的最短数。 如果你希望它不要去以往任何QS,你必须使用一个否定的字符类:

Q[^Q]*?XYZ

[^ Q]匹配任何一个字符不是Q.记住这将仅适用于单个字符的工作。 如果你的开放定界符多个字符,你必须做它用不同的方式。 为什么? 那么,使用分隔符“PQR”和字符串

foo PQR bar XYZ 

如果您尝试使用正则表达式从之前的,但你扩展的字符类:

PQR[^PQR]*?XYZ

然后你会得到

'PQR bar XYZ'

如你预期。 但是,如果你的字符串

foo PQR Party Time! XYZ 

你会得到不匹配。 这是因为[]描绘了一个“字符类” - 只与一个字符匹配。 使用这些类,你可以简单地把它们列出匹配字符的范围。

th[ae]n

将同时匹配“比”和“然后”,而不是“瘦”。 在首加克拉(“^”)否定了阶级 - 意思是“匹配任何东西,但这些字符” - 因此把我们的一个字符分隔成[^ PQR],而不是说“不‘PQR’”你”再次说 “不 'P', 'Q',或 'R'”。 如果你想,但只有当你是100%肯定,从您的分隔符字符将只在您的分隔符,您仍然可以使用此功能。 如果是这样的话,它的速度更快使用贪婪匹配,只有否定了你的分隔符的第一个字符。 对于正则表达式为:

PQR[^P]*XYZ 

但是,如果你不能保证做到这一点,那么搭配:

PQR(?:.(?!PQR))*?XYZ

正则表达式不直接支持负字符串匹配(因为它是无法界定的,当你想想看),所以你必须使用负前瞻

(?!PQR)

就是这样的预计。 它的意思是“断言,未来数字符不是这个内部正则表达式”,没有任何字符匹配,所以

.(?!PQR)

匹配后面没有PQR任何字符。 总结一组中,这样就可以懒洋洋地重复它,

(.(?!PQR))*?

和你有一个匹配“的字符串,不包含我的分隔符”。 我做的唯一的事情就是添加一个:使之成为非捕获组。

(?:.(?!PQR))*?

根据您使用解析您正则表达式语言,可以尝试单独传回每个匹配的组(用于查找和替换)。 这使得它这样做。

快乐regexing!



Answer 2:

贪婪的概念只适用于右侧。

为了使表达只能从XYZ前的最后一个Q匹配,使其不符合他们之间问:

Q[^Q]*?XYZ


文章来源: regular expression greedy on left side only (.net)