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

Regex-将C#Regex转换为JavaScript Regex的量词的目标无效

在.NET中,此正则表达式必须与IgnorePatternWhitespaceIgnoreCase标志一起使用,因为存在阻止匹配的空格。这是一个演示。

将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

请参阅演示(注意,我还删除了一些不必要的转义符号)。