正则表达式:匹配以某些字母开头的特定长度的单词

时间:2013-05-06 20:19:54

标签: php regex

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

中的start startin starting匹配

3 个答案:

答案 0 :(得分:5)

一般提示:

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

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

  • 最后,为上一步中的字符类添加重复量词。在你的情况下,st之后你需要正好5个字符,所以重复量词是{5}

  • 如果您只想匹配整个字符串,请在开头使用\A,在正则表达式结束时使用\z。或者在正则表达式的开头/结尾包含\b以匹配所谓的字边界(包括字符串的开头/结尾,空格,标点符号)。 最强大的选择(完全控制)是所谓的 lookahead - 为了简单起见,我会把它留在这里。

有关详细信息,请参阅this tutorial。您可以查找我提到的特定关键字,例如重复字符类 unicode lookahead 等。

答案 1 :(得分: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
)

答案 2 :(得分:0)

preg_match_all('/\bst\w{5}\b/', 'start startin starting', $arr, PREG_PATTERN_ORDER);

更新:根据评论

使用前后的字边界