正则表达式检查前两个单词是否相同

5

例如:

$s1 = "Test Test the rest of string"
$s2 = "Test the rest of string"

我想要匹配正向$s1但不包括$s2,因为$s1中的第一个单词与第二个相同。单词'Test'是示例,正则表达式应适用于任何单词。

4个回答

8
if(preg_match('/^(\w+)\s+\1\b/',$input)) {
  // $input has same first two words.
}

解释:

^    : Start anchor
(    : Start of capturing group
 \w+ : A word
)    : End of capturing group
\s+  : One or more whitespace
\1   : Back reference to the first word
\b   : Word boundary

4
~^(\w+)\s+\1(?:\W|$)~
~^(\pL+)\s+\1(?:\PL|$)~u // unicode variant

\1 是对第一个捕获组的反向引用。


这个表达式对于 Text Teststr 给出了一个错误的结果。 - user142162

1

并非在所有地方都有效,请参阅评论...

^([^\b]+)\b\1\b
^(\B+)\b\1\b

获取第一个单词,并匹配在单词边界之后再次重复相同单词。


字符类中的 \b 不是单词边界,而是退格符。 - codaddict
@codaddict:谢谢,不确定是这样还是那样 :) - poke
\b\B是零宽断言,它们不会匹配任何东西,当然也不会相互匹配。在此基础上,你启发了这个问题:有什么正则表达式永远无法匹配? - Kobi
我已经在允许在字符类中使用\b的语言(ActionScript)中测试了我的原始解决方案(^([^\b]+)\b\1\b)),因此匹配任何非边界都有效;它匹配整个单词,包括后面的空格。鉴于它不能使用\B,我现在会删除这个答案,但我会保留它作为灵感参考 ;) - poke
1
它并不是真正的非边界,实际上它是非退格!但是在此之后的\b是一个边界,有一定的限制,这意味着第一组\1必须以单词字符开头并以非单词字符结尾(或者反过来),因此它将匹配例如test!test!d,但并不完全是你想象的那样。\1包括这里的“空格”,即!,因为它不是退格!这里有几个更多的例子:http://rubular.com/r/1y239zNydK - Kobi

1

这不会导致Test Testx返回true。

$string = "Test Test";

preg_match('/^(\w+)\s+\1(\b|$)/', $string);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接