【问题标题】:Regex for 1 or 2 characters after slash斜线后 1 或 2 个字符的正则表达式
【发布时间】:2022-01-01 06:16:06
【问题描述】:

我在 php 脚本中有一个 CIDR 表示法的 IP 列表,例如

    $str .= '123.23.23.4/17,';
    $str .= '123.23.23.4/23,';
    $str .= '123.23.23.4/8,';
    $str .= '123.23.23.4/18';

我正在尝试获取斜线后的所有数字。可能的范围是 1 - 31。从我在这里找到的例子中我试过这个 3 preg_match_all("//[1-3][0-9]/", $str, $matches);

给了

    /17
    /23
    /18

然后我尝试了

    preg_match_all("/\/[1-31]{1,2}/", $str, $matches);

    /1
    /23
    /1

所以 /8 在这两种情况下都被遗漏了,第二个返回了错误的数字。请问有人可以提供正确的命令吗?

【问题讨论】:

  • 看起来你可以在, 上爆炸,然后在/ 上爆炸
  • Quick demo 我所说的。我通常喜欢在绝对需要之前避免使用 RegEx,但这是个人喜好。该演示更冗长,行数更多,但我认为它更容易扫描,特别是如果它包含解释它正在使用的数据的 cmets。它还将根据您的真实数据,让您有机会找到逻辑中的异常,RegEx 可能会忽略这些异常。

标签: php regex digits slash


【解决方案1】:

使用 \/[1-3][0-9] 匹配至少 2 位数字,从 11 到 39

使用[1-31]{1,2}[1-3]{1,2} 相同,匹配范围1-3 的1 或2 次​​p>

如果你只想要使用 php 的数字:

/\K(?:[1-9]|[12][0-9]|3[01])\b

如果你想让模式更具体,你可以看到这个页面到match an ip number

模式匹配:

  • / 匹配正斜杠(使用不同的分隔符,如 ~,您不必转义 \/
  • \K忘记到目前为止匹配的内容
  • (?:[1-9]|[12][0-9]|3[01]) 匹配 1-9 或 10-29 或 30 或 31
  • \b防止部分单词匹配的单词边界

查看regex demoPHP demo

$str = '123.23.23.4/17,';
$str .= '123.23.23.4/23,';
$str .= '123.23.23.4/8,';
$str .= '123.23.23.4/18';

preg_match_all("~/\K(?:[1-9]|[12][0-9]|3[01])\b~", $str, $matches);
print_r($matches[0]);

输出

Array
(
    [0] => 17
    [1] => 23
    [2] => 8
    [3] => 18
)

【讨论】:

  • 感谢您的解释和示例。除了我得到 /k 的未知修饰符错误之外,这很有效。我将其更改为 \/k 并运行并给出了正确的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多