Regex-将C#Regex转换为JavaScript Regex的量词的目标无效
本文关键字:量词 目标 无效 Regex JavaScript C#Regex 转换 Regex- | 更新日期: 2023-09-27 18:27:18
我正在尝试转换C#电子邮件正则表达式,它是我从MSDN示例中获得的
@"^(?("")("".+?(?<!'')""@)|(([0-9a-z](('.(?!'.))|[-!#'$%&''*'+/='?'^`'{'}'|~'w])*)(?<=[0-9a-z])@)) (?('[)('[('d{1,3}'.){3}'d{1,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_])@))(?('[)('[('d{1,3}'.){3}'d{1,3}'])|(([0-9a-zA-Z][-'w]*[0-9a-zA-Z]*'.)+[a-zA-Z]{2,6}))$
但我得到错误:
:限定符的目标无效。
<:JavaScript 中不支持Lookbacking
我需要帮助转换以上Regex
在.NET中,此正则表达式必须与IgnorePatternWhitespace
和IgnoreCase
标志一起使用,因为存在阻止匹配的空格。这是一个演示。
将regex移植到JS时遇到的问题是由于JS regex不支持lookbehinds和conditionals这一事实造成的。
JS有一个有条件的变通方法:.NET (?(")"[^"]*"|'w+)
可以翻译为(?:(?=")"[^"]*"|(?!")'w+)
。
lookbehinds很难转换,但在这里,第一个lookbehind似乎不合适。您正在寻找最接近的一组无标题双引号。你可以用"[^"'']*(?:''.[^"'']*)*"
来做。
第二个查找只是检查@
前面是否有字母或数字字符。处理这一问题的最简单方法是将[a-z0-9]
字符类添加到@
符号的左侧,并将?
量词应用于该替换项的第一组,使数字或字母出现在@
之前,并且1个字符的用户部分仍然匹配。
所以,你可以使用
/^(?:(?=")("[^"'']*(?:''.[^"'']*)*"@)|(?!")(([0-9a-z](('.(?!'.))|[-!#$%&'*+'/=?^`{}|~'w])*)?[a-z0-9]@))(?:(?='[)('[('d{1,3}'.){3}'d{1,3}'])|(?!'[)(([0-9a-z][-'w]*[0-9a-z]*'.)+[a-z0-9][-a-z0-9]{0,22}[a-z0-9]))$/i
请参阅演示(注意,我还删除了一些不必要的转义符号)。