【问题标题】:Match number at the end of the string匹配字符串末尾的数字
【发布时间】:2009-09-20 12:57:38
【问题描述】:

给定以下字符串,我如何匹配它末尾的整个数字?

$string = "Conacu P PPL Europe/Bucharest 680979";

我不得不说字符串的长度不是恒定的。

我选择的语言是 PHP。

谢谢。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您可以使用带有preg_match 的正则表达式,如下所示:

    $string = "Conacu P PPL Europe/Bucharest 680979";
    
    $matches = array();
    if (preg_match('#(\d+)$#', $string, $matches)) {
        var_dump($matches[1]);
    }
    

    你会得到:

    string '680979' (length=6)
    

    这里有一些信息:

    • 正则表达式开头和结尾的# 是分隔符——它们没有任何意义:它们只是表示正则表达式的开头和结尾;你可以使用任何你想要的字符(人们经常使用/
    • 模式末尾的“$”表示“字符串的结尾”
    • () 表示您想要捕获它们之间的内容
      • 使用preg_match,作为第三个参数给出的数组将包含那些捕获的数据
      • 该数组中的第一项将是整个匹配的字符串
      • 接下来的将包含在一组()中匹配的每个数据
    • \d 表示“一个数字”
    • + 表示一次或多次

    所以:

    • 匹配一个或多个数字
    • 在字符串的末尾

    更多信息,您可以查看PCRE PatternsPattern Syntax

    【讨论】:

    • 在你的正则表达式周围使用#而不是/有什么特别的好处吗?只是为了我自己的好奇心?
    • 你不需要分组。 $matches[0] 已包含整个匹配项。
    • 在这种情况下不是,但在某些情况下,当您想在正则表达式中使用 / 作为要匹配的字符时,它是有意义的。有些人只是出于习惯而做这种事情(例如,我通常使用@符号)
    • @Mark:在这种情况下不是;但是如果模式确实包含一些斜杠(例如 URL 的一部分),则会有所不同;; @Psyche:不客气;; @Gumbo:是的;但我更喜欢从一开始就已经进行分组,因为这一天我必须修改模式以添加更多内容:这样,我就不必修改其余代码
    【解决方案2】:

    以下正则表达式应该可以解决问题:

    /(\d+)$/
    

    【讨论】:

      【解决方案3】:

      编辑: 此答案检查字符串中的最后一个字符是否为数字。由于问题https://stackoverflow.com/q/12258656/1331430 与此问题完全相同,因此我将在此处发布我的答案。不过,对于这个问题的 OP 要求什么,请使用接受的答案。


      这是我检查字符串中最后一个字符是否为数字的非正则表达式解决方案:

      if (ctype_digit(substr($string, -1))) {
          //last character in string is a digit.
      }
      

      DEMO

      substr 传递 start=-1 将返回字符串的最后一个字符,然后与 ctype_digit 进行检查,如果字符是数字则返回 true,否则返回 false

      参考资料:

      1. substr
      2. ctype_digit

      【讨论】:

        【解决方案4】:

        在不使用正则表达式的情况下获取字符串末尾的数字:

        function getNumberAtEndOfString(string $string) : ?int 
        {
          $result = sscanf(strrev($string), "%d%s");
          if(isset($result[0])) return strrev($result[0]);
          return null;
        }
        var_dump(getNumberAtEndOfString("Conacu P PPL Europe/Bucharest 680979")); //int(680979)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-05
          • 1970-01-01
          • 2019-09-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多