例如:
$s1 = "Test Test the rest of string"
$s2 = "Test the rest of string"
我想要匹配正向$s1
但不包括$s2
,因为$s1
中的第一个单词与第二个相同。单词'Test'
是示例,正则表达式应适用于任何单词。
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
~^(\w+)\s+\1(?:\W|$)~
~^(\pL+)\s+\1(?:\PL|$)~u // unicode variant
\1
是对第一个捕获组的反向引用。
并非在所有地方都有效,请参阅评论...
^([^\b]+)\b\1\b
^(\B+)\b\1\b
获取第一个单词,并匹配在单词边界之后再次重复相同单词。
\b
不是单词边界,而是退格符。 - codaddict\b
的语言(ActionScript)中测试了我的原始解决方案(^([^\b]+)\b\1\b)
),因此匹配任何非边界都有效;它匹配整个单词,包括后面的空格。鉴于它不能使用\B
,我现在会删除这个答案,但我会保留它作为灵感参考 ;) - poke\b
是一个边界,有一定的限制,这意味着第一组\1
必须以单词字符开头并以非单词字符结尾(或者反过来),因此它将匹配例如test!test!d
,但并不完全是你想象的那样。\1
包括这里的“空格”,即!
,因为它不是退格!这里有几个更多的例子:http://rubular.com/r/1y239zNydK - Kobi这不会导致Test Testx
返回true。
$string = "Test Test";
preg_match('/^(\w+)\s+\1(\b|$)/', $string);
Text Teststr
给出了一个错误的结果。 - user142162