【问题标题】:Find the position of the first occurrence of any number in string查找字符串中任意数字第一次出现的位置
【发布时间】:2011-11-21 16:13:03
【问题描述】:

有人可以帮我找出字符串中任何数字第一次出现的位置吗?

我在网上找到的代码不起作用:

function my_offset($text){
    preg_match('/^[^\-]*-\D*/', $text, $m);
    return strlen($m[0]);
}
echo my_offset('[HorribleSubs] Bleach - 311 [720p].mkv');

【问题讨论】:

  • 试试 preg_match('/[\d]+/', $text, $m);
  • 另外,我发现使用在线“python regex repl”来测试和调试正则表达式很方便。例如:pythex.org

标签: php regex string character find-occurrences


【解决方案1】:
function my_offset($text) {
    preg_match('/\d/', $text, $m, PREG_OFFSET_CAPTURE);
    if (sizeof($m))
        return $m[0][1]; // 24 in your example

    // return anything you need for the case when there's no numbers in the string
    return strlen($text);
}

【讨论】:

  • 更有意义。我(和 RegexBuddy)不知道 PREG_OFFSET_CAPTURE :)
【解决方案2】:

内置的 PHP 函数 strcspn() 在使用时将与 Stanislav Shabalin 的答案中的函数相同:

strcspn( $str , '0123456789' )

例子:

echo strcspn( 'That will be $2.95 with a coupon.' , '0123456789' ); // 14
echo strcspn( '12 people said yes'                , '0123456789' ); // 0
echo strcspn( 'You are number one!'               , '0123456789' ); // 19

HTH

【讨论】:

  • 我敢打赌,这比任何正则表达式解决方案都要快 20 倍
【解决方案3】:
function my_ofset($text){
    preg_match('/^\D*(?=\d)/', $text, $m);
    return isset($m[0]) ? strlen($m[0]) : false;
}

应该为此工作。原始代码要求- 出现在第一个数字之前,也许这就是问题所在?

【讨论】:

  • 如果字符串中没有数字则返回原始字符串的长度?
  • @gašper:对。可以修复,但斯坦尼斯拉夫的解决方案要好得多。
  • 为什么他的解决方案更好?如果字符串中没有数字,它会返回 1(使用他的算法)。如果我使用你的,它会给我一些合乎逻辑的东西(字符串长度)。
  • @gašper 我已经编辑了我的。如果没有数字,它现在也返回字符串长度。我想这更好,因为 a) 它准确搜索数字,而不是非数字 b) 它利用 preg_match 内置功能,这总是比重新发明自行车更好。我希望蒂姆同意我的看法:-)
  • @gašper:嗯,我的解决方案有点向后弯曲(计算非数字的数量,直到第一个数字)。另外,考虑一下,我希望我的解决方案需要额外检查是否有匹配。我不是 PHP 程序员,所以我在 RegexBuddy 使用我的正则表达式创建的 sn-ps 上构建代码。
【解决方案4】:

我可以做正则表达式,但我必须进入一个改变的状态才能 记住我编码后它的作用。

这是一个您可以使用的简单 PHP 函数...

function findFirstNum($myString) {

    $slength = strlen($myString);

    for ($index = 0;  $index < $slength; $index++)
    {
        $char = substr($myString, $index, 1);

        if (is_numeric($char))
        {
            return $index;
        }
    }

    return 0;  //no numbers found
}

【讨论】:

    【解决方案5】:

    问题

    查找字符串中第一个出现的数字

    解决方案

    这是 javascript 中的非正则表达式解决方案

    var findFirstNum = function(str) {
        let i = 0;
        let result = "";
        let value;
        while (i<str.length) {
          if(!isNaN(parseInt(str[i]))) {
            if (str[i-1] === "-") {
              result = "-";
            }
            while (!isNaN(parseInt(str[i])) && i<str.length) {
              result = result + str[i];
              i++;
            }
            break;
          }
          i++;
        }
        return parseInt(result);  
    };
    

    示例输入

    findFirstNum("words and -987 555");
    

    输出

    -987
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2011-02-04
      • 2012-10-17
      • 1970-01-01
      相关资源
      最近更新 更多