【问题标题】:Regex for single digit catches two digit numbers?一位数的正则表达式捕获两位数?
【发布时间】:2021-04-05 10:43:15
【问题描述】:

这个正则表达式捕获两位数的数字:

如果我有 y11 它仍然会捕获它,如何仅匹配 y0、y1、y2、y3、y4、y5、y6、y7、y8、y9 ?数字后可能有空格、字母或点。

preg_replace('/y([1-9]{1})/', 'y0$1', $string)

【问题讨论】:

  • [1-9] 不会捕获 0 虽然

标签: php regex


【解决方案1】:

我会匹配y\d(?!\d) 模式,它匹配y 后跟一个数字,它本身后面没有另一个数字。

$string = "y2";
echo $string . "\n";
$string = preg_replace("/y(\d)(?!\d)/", "y0$1", $string);
echo $string;

打印出来:

y2
y02

正则表达式的解释:

y       the letter 'y'
(\d)    a single digit (capture it)
(?!\d)  assert that what follows is either a non digit character OR
        the end of the input

【讨论】:

    【解决方案2】:

    您可以省略 {1} 和 [1-9] 不匹配 0。该模式部分匹配例如 y11 中的 y1,因为该模式未锚定。

    您可以匹配y 后跟一个数字,并声明一个空格、点或字母或字符串的结尾。

    \by\K\d(?=[\h\p{L}.]|$)
    

    模式匹配

    • \by 匹配 y 前面有一个单词边界
    • \K 忘记到目前为止匹配的内容
    • \d匹配单个数字0-9
    • (?= 正向前瞻,断言右边是
      • [\h\p{L}.] 匹配水平空白字符、任意字母或点
      • |或者
      • $字符串结束
    • ) 关闭前瞻

    Regex demo | Php demo

    在替换中使用以0 开头的完整匹配

    $pattern = "/\by\K\d(?=[\h\p{L}.]|$)/";
    $strings = [
        "y0",
        "y1$",
        "y2H",
        "y3.",
        "y9 ",
        "y10",
        "y09  y3 ay9"
    ];
    
    foreach ($strings as $s) {
        echo preg_replace($pattern, "0$0", $s) . PHP_EOL;
    }
    

    输出

    y00
    y1$
    y02H
    y03.
    y09 
    y10
    y09  y03 ay9
    

    【讨论】:

    • 非常感谢!感谢您的帮助。
    【解决方案3】:

    使用您显示的示例,请尝试以下正则表达式。

    ^[a-zA-Z]\d[\s.a-zA-Z]?$
    

    或者您想完全匹配从 y 开始的值,然后将上面的更改为:

    ^y\d[\s.a-zA-Z]?$
    

    Online demo for above regex

    说明:为上述添加详细说明。

    ^                   ##Mentioning ^ caret sign to denote starting of value.
    [a-zA-Z]            ##Checking 1 alphabet(small/capital letters) here.
    \d                  ##Matching 1 single digit here.
    [\s.a-zA-Z]?        ##Checking either space OR DOT or small or capital letter to match, this is keep optional.
    $                   ##Mentioning end of the value here.
    

    【讨论】:

      【解决方案4】:
      [a-zA-Z]+(\d)([,\sa-zA-Z.]|\b)
      
      • [a-zA-Z]+ 匹配一个或多个字符。
      • (\d) 匹配单个数字。将它们添加到捕获组中以供以后替换。
      • ([,\sa-zA-Z.]|\b) 匹配紧跟此逗号、空格或单词边界或字母的文本。
      • 确保也添加 $2 以在替换时保留其初始表示。

      片段:

      <?php
      
      $str = 'y0, y1, y2, y03, y4, y5, y6, y7, y8, y9, y99, y101';
      
      $str = preg_replace('/[a-zA-Z]+(\d)([,\sa-zA-Z.]|\b)/','y0$1$2',$str);
      
      echo $str;
      

      【讨论】:

      • 你怎么知道 OP 在数字后面需要逗号、空格或单词边界?
      • @TimBiegeleisen 我更新了我的答案。 OP 在他的帖子中指出 数字后可能有空格或字母或点。
      【解决方案5】:

      这个怎么样

      ^y(\d)[A-Za-z\s\.]?$

      https://regex101.com/r/FxQA0T/1

      或者

      ^y(\d)[^\d]?$

      【讨论】:

        猜你喜欢
        • 2012-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-09
        • 1970-01-01
        • 2021-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多