【问题标题】:php preg_match - pattern for number at end of string, always preceded by space, in turn preceded by any characters?php preg_match - 字符串末尾数字的模式,总是以空格开头,然后以任何字符开头?
【发布时间】:2021-11-11 08:32:09
【问题描述】:

我正在尝试从字符串中提取一个数字。该字符串是一个文件名,其内容是可变的,但将以空格后跟一个数字结尾。

所以像a b 1212a 1212 这样的字符串。我不确定文件名是否会以空格开头,但 1212 之类的内容不应产生匹配项。

我目前正在使用

preg_match('#^(.)* (\d*)$#', $str, $matches);

但这会返回匹配 1212 之类的情况。

我考虑过反转字符串并这样做

preg_match('#^(\d*)(\s*)(.*)$#', strrev($str), $matches);
var_dump(strrev($matches[1]));

并检查if $matches[1] != '',这似乎可行,但我试图更好地理解正则表达式,这样我就可以在没有相反的情况下做到这一点,并为get number at end of string, which is always preceded by a space, and where that space in turn is always preceded but anything的情况找出正确的模式。

想法?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    你可以试试这个方法:

    preg_match("/^\S.* (\b\d+)$/", $str, $matches);
    echo end($matches)."\n";
    

    例如,如果您使用以下变量:

    $str = "1234 lkjsdhf ldjfh  1223";
    

    end($matches) 的调用将返回1223

    而如果您使用以下变量:

    $str = " 1212";
    

    end($matches) 的调用将保持为空。

    【讨论】:

    • 做到了!谢谢!
    【解决方案2】:

    你可以使用这个正则表达式:

    ^\S.*\b(\d+)$
    

    RegEx Demo

    正则表达式详细信息:

    • ^:开始
    • \S: 匹配一个非空格
    • .*:匹配 0 个或多个任意字符
    • \b:字边界
    • (\d+): 匹配捕获组#1 中的任意整数
    • $:结束

    【讨论】:

    • 末尾的数字可以是任何数字。所以像a b 1212 这样的东西会返回1212 或者像`12-03-23 12:34:43 8888` 这样的东西会返回8888
    • 对不起,迟到的评论。现在已经更新了
    • 似乎不起作用。这将返回整个匹配,而不是数字。上面的答案,preg_match("/^\S.* (\b\d+)$/", $str, $matches); 似乎适用于所有用例。
    • 我提供了一个正则表达式进行验证。不清楚您是否还想要一个捕获组,否则您可以在相同的正则表达式中执行以下操作:^\S.*\b(\d+)$ 来捕获它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多