从特定子字符串后的字符串中提取多个数字
Extract multiple numbers from a string after a specific substring
我有以下字符串:
H: 290‐314 P: 280‐301+330U+200B+331string‐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
.
忘记不需要的子字符串
我有以下字符串:
H: 290‐314 P: 280‐301+330U+200B+331string‐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
.