正则表达式 - 将 C# 正则表达式转换为 JavaScript 正则表达式的量词的目标无效
Posted
技术标签:
【中文标题】正则表达式 - 将 C# 正则表达式转换为 JavaScript 正则表达式的量词的目标无效【英文标题】:Regex - Invalid target for quantifier which converting C# Regex to JavaScript Regex 【发布时间】:2016-03-25 11:53:39 【问题描述】:我正在尝试转换来自MSDN sample 的 C# 电子邮件正则表达式
@"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\\\|~\w])*)(?<=[0-9a-z])@)) (?(\[)(\[(\d1,3\.)3\d1,3\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]0,22[a-z0-9]))$"
是这样的:
^(?(")(".+?"@)|(([0-9a-zA-Z]((\.(?!\.))|[^!#\$%&\s'\*/=\?\^`\\\|~])*)(?<=[-+0-9a-zA-Z_])@))(?(\[)(\[(\d1,3\.)3\d1,3\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z]2,6))$
但我收到以下错误:
? : 限定符的目标无效。
? : JavaScript 不支持 Lookbehind
我在转换上述正则表达式时需要帮助
【问题讨论】:
你过度验证了。使用更简单的表达式。毕竟,了解电子邮件地址是否真正有效的唯一方法是实际发送消息。 它是否与 IgnorePatternWhitespace 标志一起使用? 我的建议:搜索用 javascript 编写的类似正则表达式。互联网上有大量带有电子邮件正则表达式的网站。 【参考方案1】:在 .NET 中,此正则表达式必须与 IgnorePatternWhitespace
和 IgnoreCase
标志一起使用,因为存在阻止匹配的空格。这是demo。
将正则表达式移植到JS时遇到的问题是由于JS正则表达式不支持lookbehinds和conditionals。
对于 JS 有一个有条件的解决方法:.NET (?(")"[^"]*"|\w+)
可以翻译为 (?:(?=")"[^"]*"|(?!")\w+)
。
lookbehinds 很难转换,但在这里,第一个lookbehinds 似乎不合适。您正在寻找最接近的未转义双引号集。你可以用"[^"\\]*(?:\\.[^"\\]*)*"
来做。
第二个lookbehind只是检查@
前面是否有一个字母或数字字符。处理此问题的最简单方法是将[a-z0-9]
字符类添加到@
符号的左侧,并将?
量词应用于此替代方案的第一组,使数字或字母出现在@
和1 个字符的用户部分仍然会匹配。
所以,你可以使用
/^(?:(?=")("[^"\\]*(?:\\.[^"\\]*)*"@)|(?!")(([0-9a-z]((\.(?!\.))|[-!#$%&'*+\/=?^`|~\w])*)?[a-z0-9]@))(?:(?=\[)(\[(\d1,3\.)3\d1,3\])|(?!\[)(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][-a-z0-9]0,22[a-z0-9]))$/i
参见demo(注意我还删除了一些不必要的转义符号)。
【讨论】:
总的来说,这个(?: \b | [^_] )
是有问题的。 [^_]
不仅会匹配除下划线之外的任何内容,如果不是单词边界,它还会在 @ 符号前强制多于 1 个字符。此外,(?=\[)
和 (?!\[)
是不必要的,因为它们永远无法在交替簇中匹配。
同意,这有点问题。由于原始正则表达式不允许_@gmail.com
,我认为OP 可以安全地使用\b
而不是[^\W_]
。如果用户部分至少可以有 2 个符号,则可以使用 [^\W_]
,这一切都取决于要求。至于前瞻,它们是模拟条件构造所必需的。
单词边界 \b
单独不起作用,因为它匹配 hello_@world.com
但期待 [a-z0-9]@
。 [
上的前瞻工作,但不需要,因为这是典型的 ^(?:\[+|[^\[]+)$
情况,在交替的右侧没有匹配的 [
。事实上,这两个条件句一开始都是多余的。
条件句很可能不是必需的,但我试图展示如何在 JS 中“模拟”它。现在,正则表达式将按预期工作。
条件主要用于测试捕获的状态。他们真的没有任何其他用途。在这方面,它不能在任何不支持测试捕获的引擎中模拟。此外,两种条件路径在正则表达式中都很有用。我认为,C# 确实只有 expression 条件,它没有任何构造,伪装成前瞻断言,使它们几乎完全没用。以上是关于正则表达式 - 将 C# 正则表达式转换为 JavaScript 正则表达式的量词的目标无效的主要内容,如果未能解决你的问题,请参考以下文章
将 po box javascript 正则表达式转换为 c# 正则表达式
将 c# 正则表达式转换为 javascript 正则表达式