正则表达式帮助。捕获以 "score" 开头并以数字结尾的字符串
Regex help. Capture string starting with "score" and ending with number
我在这之前已经尝试了很多post,但是简单的不能让它工作,我需要你的帮助。
想象以下字符串:
$str = "Games >= 2 AND score >= 30 and country = 2";
或
$str = "Games >= 2 AND score < 30 and country = 2";
或
$str = "Games >= 2 AND (score between 10 and 60) and country = 2";
或
$str = "Games >= 2 AND score between 10 and 60 and country = 2";
或
$str = "score between 10 and 20 and Games >= 2";
或
$str = "score between 2 and 9 and Games >= 2";
或
$str = "Games >= 2 AND score = 3";
有我的正则表达式
$re = '/(score.*\d\d|score.*\d)/mi';
preg_match($re, one_of_those_strings_above, $matches, PREG_OFFSET_CAPTURE, 0);
var_dump($matches);
你可以在这里查看
https://regex101.com/r/6Nt3UX/3
我可以捕获我想要的,但如果数字小于 10(例如在 2 到 9 之间),则正则表达式会失败。
非常感谢。
看来我们需要更具体一些。
(score\s*(?:[><]?=|between)\s*\d+(?:\s+and\s+\d+)?)
解释:
整个正则表达式returns只有一组。 (?:...)
构造是一个非捕获组。
- 开头为
score
- 后跟零个或多个空格
\s*
(如果你有score=
)
- 后跟
>=
、<=
、=
或 between
:[><]?=|between
- 后跟零个或多个空格
\s*
- 后跟一位或多位数字
\d+
- 后跟由零个或多个空格组成的可选字符串,后跟
and
后跟零个或多个空格,后跟一个或多个数字。 (?:\s+and\s+\d+)?
最后一个非捕获组中and\s+\d+
的特殊性消除了第2个分数后面跟and xyz = 5
这样的短语的情况
尝试:
/score.*(?<!\d)\d\d?(?!\d)/
score
匹配 score
.
.*
0 个或多个非换行符的贪婪最大匹配。如果需要 .
来匹配换行符,请使用标志 s
。
(?<!\d)\d\d?(?!\d)
将一个或两个数字与断言匹配,即它们之前或之后没有任何其他数字。因此,将执行最大匹配,直到找到一个或两个数字。
我在这之前已经尝试了很多post,但是简单的不能让它工作,我需要你的帮助。
想象以下字符串:
$str = "Games >= 2 AND score >= 30 and country = 2";
或
$str = "Games >= 2 AND score < 30 and country = 2";
或
$str = "Games >= 2 AND (score between 10 and 60) and country = 2";
或
$str = "Games >= 2 AND score between 10 and 60 and country = 2";
或
$str = "score between 10 and 20 and Games >= 2";
或
$str = "score between 2 and 9 and Games >= 2";
或
$str = "Games >= 2 AND score = 3";
有我的正则表达式
$re = '/(score.*\d\d|score.*\d)/mi';
preg_match($re, one_of_those_strings_above, $matches, PREG_OFFSET_CAPTURE, 0);
var_dump($matches);
你可以在这里查看 https://regex101.com/r/6Nt3UX/3
我可以捕获我想要的,但如果数字小于 10(例如在 2 到 9 之间),则正则表达式会失败。
非常感谢。
看来我们需要更具体一些。
(score\s*(?:[><]?=|between)\s*\d+(?:\s+and\s+\d+)?)
解释:
整个正则表达式returns只有一组。 (?:...)
构造是一个非捕获组。
- 开头为
score
- 后跟零个或多个空格
\s*
(如果你有score=
) - 后跟
>=
、<=
、=
或between
:[><]?=|between
- 后跟零个或多个空格
\s*
- 后跟一位或多位数字
\d+
- 后跟由零个或多个空格组成的可选字符串,后跟
and
后跟零个或多个空格,后跟一个或多个数字。(?:\s+and\s+\d+)?
最后一个非捕获组中and\s+\d+
的特殊性消除了第2个分数后面跟and xyz = 5
尝试:
/score.*(?<!\d)\d\d?(?!\d)/
score
匹配score
..*
0 个或多个非换行符的贪婪最大匹配。如果需要.
来匹配换行符,请使用标志s
。(?<!\d)\d\d?(?!\d)
将一个或两个数字与断言匹配,即它们之前或之后没有任何其他数字。因此,将执行最大匹配,直到找到一个或两个数字。