我需要一个匹配以.7
开头的字母单词的正则表达式'st'
。例如,它应该只匹配'startin'
以下内容:start startin starting
3 回答
一般提示:
起始符号直接包含在正则表达式中,例如
st
. 如果起始字符在正则表达式语法意义上是特殊的(如点、括号等),则需要使用反斜杠对其进行转义,但在您的情况下不需要。在起始符号之后,包括“单词”剩余字符的字符类。如果要允许所有字符,请使用点:
.
。如果要允许所有非空白字符,请使用\S
. 如果您只想允许(unicode)字母,请使用\p{L}
. 要仅允许非重音拉丁字母,请使用[A-Za-z]
. 这里有很多可能性。最后,包括上一步中字符类的重复量词。在你的情况下,你需要 5 个字符后
st
,所以重复量词是{5}
.如果您只想匹配整个字符串,请在正则表达式
\A
的开头和结尾使用。\z
或者包含\b
在正则表达式的开头/结尾以匹配所谓的单词边界(包括字符串的开头/结尾、空格、标点符号)。最强大的替代方案(完全控制)是所谓的前瞻- 为了简单起见,我将把它放在这里。
有关详细信息,请参阅本教程。您可以只查找我提到的特定关键字,例如repeat、character class、unicode、lookahead等。
要匹配具有不区分大小写的非重音字符的单词,您需要i
修饰符,或者在两种情况下都需要在开头声明两个字母。
<?php
$regex = '!\bst[a-z]{5}\b!i';
$words = "start startin starting station Stalker SHOWER Staples Stiffle Steerin StÄbles'";
preg_match_all($regex,$words,$matches);
print_r($matches[0]);
?>
输出
Array
(
[0] => startin
[1] => station
[2] => Stalker
[3] => Staples
[4] => Stiffle
[5] => Steerin
)
使用与上面相同的输出,如果您不使用i
修饰符,则必须声明更多字符:
$regex = '!\b[Ss][Tt][A-Za-z]{5}\b!';
如果你想匹配 Unicode 字符,你可以这样做:
print "<meta charset=\"utf-8\"><body>";
$regex = '!\bst([a-z]|[^u0000-u0080]){5}\b!iu';
$words = "start startin starting station Stalker SHOWER Staples Stiffle Steerin StÄbles'";
preg_match_all($regex,$words,$matches);
print_r($matches[0]);
print "</body>";
输出
Array
(
[0] => startin
[1] => station
[2] => Stalker
[3] => Staples
[4] => Stiffle
[5] => Steerin
[6] => StÄbles //without UTF-8 output it looks like this-> StÃ"bles
)
preg_match_all('/\bst\w{5}\b/', 'start startin starting', $arr, PREG_PATTERN_ORDER);
更新:根据评论使用前后的单词边界