我有这个PHP正则表达式匹配:
preg_match_all('/(\d+)(?:\.(?=(\d+)))?/', "43.3", $matches, PREG_SET_ORDER);
(至少在mi mind中)意味着:
Match one or more numbers as a group, and if there is a '.' after that
group followed by a group of numbers, match those too, but ignore the '.'.
所以,可能的字符串是:
1
23244
24.5
2.454646
但不是:
1.
现在,这在regex101.com
中完全适用于我抛出的任何测试字符串,但它似乎并没有使用PHP。如果我var_dump($matches)
:
array(2) {
[0]=>
array(3) {
[0]=>
string(3) "43."
[1]=>
string(2) "43"
[2]=>
string(1) "3"
}
[1]=>
array(2) {
[0]=>
string(1) "3"
[1]=>
string(1) "3"
}
}
43
?3
?答案 0 :(得分:1)
第一场比赛总是完全匹配,好像你的整个模式被包裹在一组括号中。我认为你不能把它关掉。
您在第一组中获得(\d+)
,因为您的模式中有两个?=
。如果您不想要,请从>>> preg_match_all('/(?<!\d)\d+(?:\.\d+)?(?![\d.])/', "43.3 31.52 1.", $matches);
=> 2
>>> $matches
=> [
[
"43.3",
"31.52"
]
]
之后的括号中删除括号。
如果您只想要完整的数字,可以尝试这样的事情:
preg_match
如果只有一个号码,则应使用preg_match_all
,而不是>>> preg_match_all('/(\d+)(?:\.(\d+))?/', "43.3", $matches)
=> 1
>>> $matches
=> [
[
"43.3"
],
[
"43"
],
[
"3"
]
]
。 e.g。
array_shift
您可以随时 <script>
var div = document.getElementById('dropzone')
</script>
完全匹配。
答案 1 :(得分:1)
两个子数组的Column1 Column2
Very long text 'UY58IOP' UY58IOP
Very long text 'UY58IOP' LDK09JY
Very long text 'LDK09JY' TE89UTY
Very long text 'TE89UTY'
Very long text 'OO48TSI'
部分中的值是在每种情况下匹配的整个字符串,然后[0]
和[1]
用于捕获组。
总体上有两场比赛,第一场比赛的整个文字是[2]
这是因为你的正则表达式在说:
43.
(\d+)
字符串的(?:\.(?=(\d+)))?
部分满足要求,因为在点之后是字符串末尾的43.
。
问题并不完全清楚,但听起来你根本不想使用前瞻3
。
例如,(?=…)
将提供以下内容:
/(\d+)(?:\.(\d+))?/