javascript - 正则表达式中的条件逻辑
问题描述
我正在尝试使用正则表达式获取以下条件逻辑。
if (text starts with +61) {
if (text after +61 is 1800) {
// then match 6 digits after 1800. So, the regex until here should be +611800 and then 6 digits
} else {
// match 9 digits after +61
}
}
我阅读了如何编写条件正则表达式。但是,我被以下正则表达式困在这里
^\+61((?=1800)\d{6}|\d{9})$
上面的正则表达式为此失败,但它必须成功
- +611800123456(这必须是成功的)
以下文本通过了正则表达式测试,但它必须失败
- +61180012345(这必须是失败的)
这是我在 regexr 网站上的测试。
解决方案
该模式表示与must be(?=1800)\d{6}
匹配的前四位数字,而您希望匹配子字符串之后的任何六位数字。这意味着,您需要将非消费模式“转换”为消费模式。\d{6}
1800
1800
(?=1800)
1800
另外,请注意,\d{9}
第二种选择将匹配任何九位数字,而您只想匹配它们不是以 . 开头的1800
。您需要在第二个替代方案之前添加一个(?!1800)
负前瞻模式。不幸的是,JavaScript RegExp 不支持条件构造,在 PCRE、.NET 等中您可以使用 ^\+61(?(?=1800)1800\d{6}|\d{9})$
,但在这种情况下不支持。
在这里,您可以使用
^\+61(?:1800\d{6}|(?!1800)\d{9})$
请参阅正则表达式演示。
细节
^
- 字符串的开始\+61
-+61
子串(?:1800\d{6}|(?!1800)\d{9})
- 一个匹配的非捕获组1800\d{6}
-1800
子字符串,然后是任意六位数字|
- 或者(?!1800)\d{9}
- 任何不以开头的九位数字1800
$
- 字符串结束。
推荐阅读
- netsuite - NetsSuite 并行审批工作流
- azure - 如何仅将选定的 NuGet 包从 Azure Pipeline 发布到 Artifactory?
- python - 如何使用tight_layout 保持轴纵横比
- visual-studio - Visual Studio 2019 - 检测扩展的工具窗口何时关闭
- haskell - How can Haskell integer literals be comparable without being in the Eq class?
- makefile - 将变量从一个 makefile 传递到另一个
- sql-server - 从 Excel 在 SQL Server 数据库中运行 SQL 脚本(在 Excel 中预先生成)
- javascript - JavaScript 按钮无法在移动设备上正确调整大小
- python - 如何提取 .msg 文件?
- python - 如何根据 sg.Combo 中选择的内容更改 PySimleGui 中的窗口?