我想两个字符串之间捕获匹配。
例如,我在寻找一个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 ,但有些事情我只是没有搞清楚。
我是一个正则表达式新手,所以有这方面的帮助将不胜感激!
好了,不贪婪的匹配工作 - 它得到满足正则表达式最短的字符串。 你必须记住的是, 正则表达式是左到右的过程 。 因此,它的第一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!
贪婪的概念只适用于右侧。
为了使表达只能从XYZ前的最后一个Q匹配,使其不符合他们之间问:
Q[^Q]*?XYZ