从特定子字符串后的字符串中提取多个数字

Extract multiple numbers from a string after a specific substring

我有以下字符串:

H: 290​‐​314 P: 280​‐​301+330​​​​U+200B+331​string‐​305+351+338​‐​308+310 [2]

我需要 P: 之后的所有数字:[280,301,330,331,305,351,338,308,310]

请注意,U+200B 是字符代码,应忽略。

我试过#P:\s((\d+)[​\‐]+)+#,但没用。

您可以使用

(?:\G(?!\A)(?:[^\d\s]*200B)?|P:\h*)[^\d\s]*\K(?!200B)\d+

参见regex demo

详情:

  • (?:\G(?!\A)(?:[^\d\s]*200B)?|P:\h*) - 上一个成功匹配的结尾,然后是 digits/whitespace 和 200B 以外的任何零个或多个字符,或者 P: 和零个或多个水平空格
  • [^\d\s]* - 除数字和空格外的零个或多个字符
  • \K - 匹配重置运算符,它丢弃到目前为止从整个匹配内存缓冲区匹配的文本
  • (?!200B)\d+ - 一个或多个未开始 200B 字符序列的数字。

PHP demo:

$text = 'H: 290‐314 P: 280‐301+330U+200B+331string‐305+351+338‐308+310 [2]';
if (preg_match_all('~(?:\G(?!\A)(?:[^\d\s]*200B)?|P:\h*)[^\d\s]*\K(?!200B)\d+~', $text, $matches)) {
    print_r($matches[0]);
}

输出:

Array
(
    [0] => 280
    [1] => 301
    [2] => 330
    [3] => 331
    [4] => 305
    [5] => 351
    [6] => 338
    [7] => 308
    [8] => 310
)

我会这样使用 continue 运算符:(Demo)

$str = 'H: 290‐314 P: 280‐301+330U+200B+331string‐305+351+338‐308+310 [2]';
preg_match_all('~(?:P: |\G(?!^)(?:U\+200B)?[^\d ]+)\K\d+~', $str, $m);
var_export($m[0]);

P: 开始,然后匹配连续的数字。 使用非数字、非空格和您列入黑名单的字符串作为分隔符。 使用 \K.

忘记不需要的子字符串