正则表达式帮助。捕获以 "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只有一组。 (?:...) 构造是一个非捕获组。

  1. 开头为 score
  2. 后跟零个或多个空格\s*(如果你有score=
  3. 后跟 >=<==between[><]?=|between
  4. 后跟零个或多个空格\s*
  5. 后跟一位或多位数字\d+
  6. 后跟由零个或多个空格组成的可选字符串,后跟 and 后跟零个或多个空格,后跟一个或多个数字。 (?:\s+and\s+\d+)?

最后一个非捕获组中and\s+\d+的特殊性消除了第2个分数后面跟and xyz = 5

这样的短语的情况

尝试:

/score.*(?<!\d)\d\d?(?!\d)/

See Regex Demo

  1. score 匹配 score.
  2. .* 0 个或多个非换行符的贪婪最大匹配。如果需要 . 来匹配换行符,请使用标志 s
  3. (?<!\d)\d\d?(?!\d) 将一个或两个数字与断言匹配,即它们之前或之后没有任何其他数字。因此,将执行最大匹配,直到找到一个或两个数字。