如何从正则表达式字符类中排除换行符?

时间:2011-04-24 03:52:48

标签: regex pcre

鉴于此PCRE模式:

/(<name>[^<>]*<\/name>[^<>]*<phone>[^<>]*<\/phone>)/

这个主题文字:

<name>John Stevens</name>  <phone>888-555-1212</phone>
<name>Peter Wilson</name>  
<phone>888-555-2424</phone>

如何让正则表达式与第一个名字 - 电话对匹配,而不是第二个?我不想匹配由换行符分隔的对。我尝试在否定的字符类中包含一行结尾,如[^<>$]*,但没有任何改变。

您可以使用以下在线工具来测试您的表达:
http://rubular.com/
http://www.regextester.com/
谢谢。

3 个答案:

答案 0 :(得分:3)

我认为这样做会

/<name>[^<>]*<\/name>[^<>\r\n]*<phone>[^<>]*<\/phone>/

无论你在班级[ ]中放置什么,都必须是代表单个角色的东西。 $在一个类中被解释为文字$,可能是因为$作为行结尾是0宽度,并且不能在类中解释为这样。 (由ridgerunner评论后编辑)

顺便说一下,我取下围绕你的正则表达式的括号,因为无论什么匹配都可以称为整个匹配。

答案 1 :(得分:1)

如果您不想匹配换行符分隔的对,那么跟随正则表达式将完成这项工作:

/(<name>[^<>]*<\/name>.*?<phone>[^<>]*<\/phone>)/

仅匹配名字,电话对,因为点.EOL不匹配,但[^<>]将与之匹配。

http://rubular.com/r/amXvq20sl8

上进行了测试

答案 2 :(得分:0)

这些网站似乎不支持整个PCRE语法。我用过这个网站: http://lumadis.be/regex/test_regex.php

这很有效:

/^(<name>[^<>]*<\/name>[^<>$]*<phone>[^<>]*<\/phone>)/

/(?-s)(<name>[^<>]*<\/name>.*<phone>[^<>]*<\/phone>)/

可能更好