我需要找到所有一位数字的文字。
我的代码:
$string = 'text 4 78 text 558 my.name@gmail.com 5 text 78998 text';
$pattern = '/ [\d]{1} /';
(结果:4和5)
一切都很完美,只是想问一下使用空格是否正确? 也许还有其他方法来区分一位数字。
由于
答案 0 :(得分:16)
首先,[\d]{1}
相当于\d
。
至于你的问题,最好使用零宽度断言,如lookbehind/lookahead或字边界(\b
)。否则您将不会匹配连续的单个数字,因为第二个数字的前导空格将匹配为第一个数字的尾随空格(并且将找不到重叠的匹配)。
以下是我写这个的方法:
(?<!\S)\d(?!\S)
这意味着“只有在前面没有非空格字符时才匹配数字,并且后面没有非空白字符”。
我使用了像(?!\S)
这样的双重否定而不是(?=\s)
,这样您就可以匹配字符串开头或结尾的单个数字。
我比\b\d\b
更喜欢这个例子,因为看起来你真的只想在数字被空格包围时匹配,而\b\d\b
会匹配4
和{在5
要在结尾处允许标点符号,您可以使用以下内容:
192.168.4.5
将数字后允许的任何其他标点符号添加到字符类(方括号内,但请确保它位于(?<!\S)\d(?![^\s.,?!])
之后)。
答案 1 :(得分:13)
使用word boundaries。请注意,范围量词{1}
(单个\d
只匹配一个数字),字符类[]
是多余的,因为它只包含一个字符。
\b\d\b
答案 2 :(得分:5)
搜索字边界:
\b\d\b
正如其他人所解释的那样,这将提取单个数字,这意味着某些特殊字符可能不会像“。”那样受到尊重。在一个IP地址。为了解决这个问题,请参阅F.J和Mike Brant的回答。
答案 3 :(得分:0)
这实际上取决于数字的出现位置以及您是否关心其他字符(如句子末尾的.
)。至少,我会使用单词边界,以便您可以在输入字符串的开头和结尾处获取数字:
$pattern = '/\b\d\b/';
但你可能会在最后考虑标点符号,如:
$pattern = '/\b\d(\b|\.|\?|\!)/';