正则表达式:在文本的开头或结尾处匹配字符串

时间:2012-11-21 12:35:29

标签: php regex

我正在尝试找到一个包含三种可能形式的字符串:

ab10
ab 10
ab-10

到目前为止,我已设法创建此正则表达式

/\s+[a-zA-Z]{2}[-|\s.]?\d{2,3}\s+/

适用于以下文字:

start foo ab 10 end foo.

当搜索到的字符串位于文本的开头或末尾时,会出现问题,如:

ab 10 end foo.

在这种情况下,开头没有空格。所以如果字符串位于文本的开头(或结尾),我需要匹配,但我不知道如何做到这一点

有人可以给我一些帮助吗?

2 个答案:

答案 0 :(得分:2)

这可以解决您的问题:

/\b[a-zA-Z]{2}[-|\s.]?\d{2,3}\b/

\b表示单词边界,它断言一方(当前位置之前或之后)是非单词字符而另一方是单词字符(由\w定义的单词字符)。

请注意,如果您有#ab10.之类的字符串,那么ab10仍会匹配。但是_ab10不会匹配,因为_是一个单词字符。

如果要断言要搜索的字符串之前和之后的字符必须是空格字符(由\s定义),或者行的开头/结尾。我使用了后视和前瞻零宽度断言。

/(?<=^|\s)[a-zA-Z]{2}[-|\s.]?\d{2,3}(?=\s|$)/

上面的正则表达式在#ab10.ab10.

中找不到任何匹配项

答案 1 :(得分:1)

我想你想要word boundaries \b

/\b[a-zA-Z]{2}[-|\s.]?\d{2,3}\b/

here on Regexr

现在匹配,前面没有单词字符而后面没有单词字符。

单词字符是预定义字符类\w的成员,它们是字母,数字和下划线。