【问题标题】:regex next pattern number = previous pattern number + 1正则表达式下一个模式编号 = 上一个模式编号 + 1
【发布时间】:2021-04-21 08:55:23
【问题描述】:

我正在尝试创建一个正则表达式模式来检查包含以“-”分隔的两年的字符串,其中 B 年 = A 年 + 1 年,这些日期介于 2000 年和 2099 年之间(日期从 20 年开始)

现在我有一个像 /^20[0-9]{2}-20[0-9]{2}$ it's/g 这样的正则表达式,但我不知道如何添加像“year B = year A - 1”这样的规则

我希望在进行 preg_match 时得到这些结果:

2009-2010 -> true
2019-2020 -> true
2020-2021 -> true

1999-2000 -> false
2001-2099 -> false
2013-2020 -> false
2099-2100 -> false
2000-2100 -> false

【问题讨论】:

  • 匹配后以编程方式执行。捕获这两个数字,减去并检查。在 PHP 中匹配时,Regex 无法进行匹配(您不能像在 Perl 或 Raku 中那样使用代码块)。

标签: php regex preg-match


【解决方案1】:

你不能用正则表达式做数学

您可以使用 2 个捕获组捕获 2 个数字。使用 php,您可以检查值是否在 2000 和 2099 的阈值之间,并检查第一个值加一是否等于第二个值。

$strings = [
    "2009-2010",
    "2019-2020",
    "2020-2021",
    "1999-2000",
    "2001-2099",
    "2013-2020",
    "2099-2100",
    "2000-2100"
];

$pattern  = "/^(20\d\d)-(20\d\d)/";
foreach ($strings as $str){
    if (preg_match($pattern, $str, $match)) {
        if (intval($match[1]) + 1 === intval($match[2])) {
            echo "$str is correct". PHP_EOL;
        }
    }
}

输出

2009-2010 is correct
2019-2020 is correct
2020-2021 is correct

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 2014-05-21
    • 1970-01-01
    • 2013-04-03
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多