【问题标题】:Regex fallback if multiple conditions were not met如果不满足多个条件,则正则表达式回退
【发布时间】:2022-07-21 18:56:22
【问题描述】:

我正在创建一个当前运行良好的 IBAN 检查器:它识别前 2 个字符(例如 DE 或 GB)并根据匹配的国家/地区代码检查特定的 IBAN 结构(DE 后仅跟数字,而 GB 有一个那里某处的一些字母)。所以这些东西都得到了很好的检查。

这里是没有后备的工作代码:https://regex101.com/r/HqThjy/1

^(?:GB\d{2}[A-Z]{4}\d{14}|DE\d{20})$

this matches:
DE12312341212312312312
GB12ASDF12312312312311

但我想集成一个后备选项,以在我想要特别检查的指定国家/地区(让我们坚持使用 DE 和 GB)匹配时,例如使用代码 NO 的挪威。我目前的后备想法以 ELSE 条件结束我的示例,但这也匹配错误的 DE 和 GB 字符串:https://regex101.com/r/HqThjy/3

^(?:GB\d{2}[A-Z]{4}\d{14}|DE\d{20})|[A-Z]{2}(?:[A-Z]|\d){13,}$

this matches:
DE12312341212312312312
GB12ASDF12312312312311
NO1212121212121
DE1231234121231 <- should not be a match
GB1231231231231 <- should not be a match

有没有办法告诉正则表达式,如果它不匹配“DE GB”然后检查任何东西,但不是 DE/GB?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    在输入问题和准备示例时,我偶然发现了这个SO question,它有解决方案:negative lookbehind

    我将我的代码修改为如下所示:https://regex101.com/r/HqThjy/4

    ^(?:GB\d{2}[A-Z]{4}\d{14}|DE\d{20})|[A-Z]{2}(?<!DE|GB)(?:[A-Z]|\d){13,}$
    

    这个[A-Z]{2}(?&lt;!DE|GB) 可以解决问题。它会查找 2 个大写字母,并且仅在它们前面的 2 个字符不是 DEGB 时才会继续。更多关于Lookbehind的信息在这里:regular-expressions.info

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      相关资源
      最近更新 更多