我有以下正则表达式,我试图检测#x,x是一个数字。当比赛2周围没有任何东西时,我能够让它工作,但是如果有,那么它就会中断。有人可以帮我解决这个问题吗?
/(\G|\s+|^)#(\d+)((?=\s+)|(?=::)|$)/i
将适用于
行This is a test #1234 end test
但这不适用于
This is a test #1234end test
This is a test#1234 end test
This is a test.#1234 end test
This is a test #1234. End test
任何人都知道需要改变什么来实现这个目标?
编辑,我试图在第3组中只允许使用字母数字,现在有::和空格。有没有办法将这些组合成1而不是检测字母或数字
答案 0 :(得分:2)
使用/#\d+/i
运行preg匹配可以获得您想要的内容。所以运行以下内容:
$items = [
"This is a test #1234end test",
"This is a test#1234 end test",
"This is a test.#1234 end test",
"This is a test #1234. End test"
];
foreach($items as $test){
preg_match("/#\d+/i", $test, $matches);
var_dump($matches);
}
你会得到这个结果:
array(1) {
[0]=>
string(5) "#1234"
}
array(1) {
[0]=>
string(5) "#1234"
}
array(1) {
[0]=>
string(5) "#1234"
}
array(1) {
[0]=>
string(5) "#1234"
}
如果您不希望结果中有#
,那么您可以执行/#(\d+)/i
然后会产生以下结果:
array(2) {
[0]=>
string(5) "#1234"
[1]=>
string(4) "1234"
}
array(2) {
[0]=>
string(5) "#1234"
[1]=>
string(4) "1234"
}
array(2) {
[0]=>
string(5) "#1234"
[1]=>
string(4) "1234"
}
array(2) {
[0]=>
string(5) "#1234"
[1]=>
string(4) "1234"
}
答案 1 :(得分:0)
(\G|\s+|^)#(\d+)((?=[^[:alnum:]])|$)
我想保留我拥有的三个小组,但我只改变了第三组。我删除了第3组中的::和\ S空格字符,只添加了一个简单的非字母数字检查,因为这也将包含这两个条件。
(\G|\s+|^)
#(\d+)
((?=[^[:alnum:]])|$)
[^[:alnum:]]