我想从字符串中提取整数(而不仅仅是数字) 例如,34681A Lincoln Street Surf City NJ 08008 应仅输出08008,而不是34681
我尝试过使用正则表达式
$str = '34681A Lincoln Street Surf City NJ 08008';
$str = preg_replace('/\D/', '', $str);
echo $str;
但它也输出34681,我不需要。
编辑(根据评论):该数字可以包含任意数量的数字,但它应该是一个独立的数字,即没有任何字母或符号(数字可以接受之前的逗号或点)
答案 0 :(得分:4)
完全由数字组成的单词的正则表达式为:
\b\d+\b
您可以使用它来提取它们。
\b
标记表示在任一方向上从单词字符到非单词字符(或字符串的开头/结尾)的零字符过渡。
例如,请参阅以下代码:
$str = 'James 7, Apt 27, 34681A Lincoln St Surf City NJ 08008';
$rc = preg_match_all('/\b\d+\b/', $str, $matches);
echo "Count = $rc\n";
for ($i = 0; $i < $rc; $i++) {
echo "Item $i is '" . $matches[0][$i] . "'\n";
}
输出:
Count = 3
Item 0 is '7'
Item 1 is '27'
Item 2 is '08008'
现在,这是专门为您的原始问题量身定制的,但如果您有其他要求,则需要调整正则表达式。
例如,根据您的编辑:
该数字可以包含任意数量的数字,但它应该是一个独立的数字,即没有任何字母或符号(可以接受数字后的逗号或点)。
正则表达式可以通过前瞻和后瞻来完成,这是现代正则表达式引擎的一个相当高级的工具,按照以下代码:
$str = '7, James 2-A 3, Apt 27, 34681A Lincoln St Surf City NJ 08008';
$rc = preg_match_all('/(?:^|(?<=[,.\s]))\d+(?=[,.\s]|$)/', $str, $matches);
echo "Count = $rc\n";
for ($i = 0; $i < $rc; $i++) {
echo "Item $i is '" . $matches[0][$i] . "'\n";
}
开头的部分(?:^|(?<=[,.\s]))
是一个非捕获组,它匹配字符串^
的开头或需要来自.
的集合中的字符的lookbehind, ,
或空格。
这几乎与最后的位(?=[,.\s]|$)
完全相同,\d+
是一个非捕获组,由字符串结尾或前面提到的字符组成。
然后剩下的就是Count = 4
Item 0 is '7'
Item 1 is '3'
Item 2 is '27'
Item 3 is '08008'
,其中被捕获,因此该程序的输出是:
{{1}}
请记住,当您添加更多规则时,正则表达式会变得非常复杂。在某些时候,编写自己的解析器可能会更好,这样你就可以获得更好的控制和可读性。
答案 1 :(得分:3)
(?:^|(?<=[,.\s]))\d+(?=[,.\s]|$)
您可以使用lookaheads
。请参阅演示。
https://regex101.com/r/vD0sJ3/3
$re = "/(?:^|(?<=\\s))\\d+(?=\\s|$)/si";
$str = "34681A Lincoln Street Surf City NJ 08008";
preg_match_all($re, $str, $matches);
或通过替换
(?:^|(?<=[,.\s]))\d+(?=[,.\s]|$)\K|.
$re = "/(?:^|(?<=[,.\\s]))\\d+(?=[,.\\s]|$)\\K|./i";
$str = "James 3, Aptt.27, 34681/A Lincoln St Surf City NJ 08008";
$subst = "";
$result = preg_replace($re, $subst, $str);
答案 2 :(得分:0)
preg_match_all('!\d+!', $str, $matches);
print_r($matches);