3

我需要一个匹配以.7开头的字母单词的正则表达式'st'。例如,它应该只匹配'startin'以下内容:start startin starting

4

3 回答 3

5

一般提示:

  • 起始符号直接包含在正则表达式中,例如st. 如果起始字符在正则表达式语法意义上是特殊的(如点、括号等),则需要使用反斜杠对其进行转义,但在您的情况下不需要。

  • 在起始符号之后,包括“单词”剩余字符的字符类。如果要允许所有字符,请使用点:.。如果要允许所有非空白字符,请使用\S. 如果您只想允许(unicode)字母,请使用\p{L}. 要仅允许非重音拉丁字母,请使用[A-Za-z]. 这里有很多可能性。

  • 最后,包括上一步中字符类的重复量词。在你的情况下,你需要 5 个字符后st,所以重复量词是{5}.

  • 如果您只想匹配整个字符串,请在正则表达式\A的开头和结尾使用。\z或者包含\b在正则表达式的开头/结尾以匹配所谓的单词边界(包括字符串的开头/结尾、空格、标点符号)。最强大的替代方案(完全控制)是所谓的前瞻- 为了简单起见,我将把它放在这里。

有关详细信息,请参阅本教程。您可以只查找我提到的特定关键字,例如repeatcharacter classunicodelookahead等。

于 2013-05-06T20:48:43.310 回答
1

要匹配具有不区分大小写的非重音字符的单词,您需要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
)
于 2013-05-06T21:22:57.700 回答
0
preg_match_all('/\bst\w{5}\b/', 'start startin starting', $arr, PREG_PATTERN_ORDER);

更新:根据评论使用前后的单词边界

于 2013-05-06T20:26:20.463 回答