【问题标题】:Extract multiple numbers from a string after a specific substring在特定子字符串之后从字符串中提取多个数字
【发布时间】:2021-10-30 18:53:59
【问题描述】:

我有以下字符串:

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+)[​\‐]+)+#,但这不起作用。

【问题讨论】:

标签: php regex preg-match-all text-extraction


【解决方案1】:

我会这样使用 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 忘记不需要的子字符串。

【讨论】:

    【解决方案2】:

    你可以使用

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

    请参阅regex demo

    详情

    • (?:\G(?!\A)(?:[^\d\s]*200B)?|P:\h*) - 前一个成功匹配的结尾,然后是除数字/空格和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
    )
    

    【讨论】:

      猜你喜欢
      • 2022-08-10
      • 1970-01-01
      • 2019-07-08
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多