鉴于此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/
谢谢。
答案 0 :(得分:3)
我认为这样做会
/<name>[^<>]*<\/name>[^<>\r\n]*<phone>[^<>]*<\/phone>/
无论你在班级[ ]
中放置什么,都必须是代表单个角色的东西。 $
在一个类中被解释为文字$
,可能是因为$
作为行结尾是0宽度,并且不能在类中解释为这样。 (由ridgerunner评论后编辑)
顺便说一下,我取下围绕你的正则表达式的括号,因为无论什么匹配都可以称为整个匹配。
答案 1 :(得分:1)
如果您不想匹配换行符分隔的对,那么跟随正则表达式将完成这项工作:
/(<name>[^<>]*<\/name>.*?<phone>[^<>]*<\/phone>)/
仅匹配名字,电话对,因为点.
与EOL
不匹配,但[^<>]
将与之匹配。
答案 2 :(得分:0)
这些网站似乎不支持整个PCRE语法。我用过这个网站: http://lumadis.be/regex/test_regex.php
这很有效:
/^(<name>[^<>]*<\/name>[^<>$]*<phone>[^<>]*<\/phone>)/
/(?-s)(<name>[^<>]*<\/name>.*<phone>[^<>]*<\/phone>)/
可能更好