正则表达式-将C#正则表达式转换为JavaScript正则表达式的量词的目标无效

正则表达式-将C#正则表达式转换为JavaScript正则表达式的量词的目标无效,javascript,c#,regex,Javascript,C#,Regex,我正在尝试转换C#email正则表达式,这是我从 @^(?“”(“”)(“+?”? 但我得到的错误是: ?:限定符的目标无效 ?在.NET中,此正则表达式必须与IgnorePatternWhitespace和IgnoreCase标志一起使用,因为存在阻止匹配的空格。下面是一个示例 将正则表达式移植到JS时遇到的问题是由于JS正则表达式不支持lookbehinds和条件 JS有一个有条件的解决方法:.NET(?(“”“[^”]*“|\w+)可以翻译为(?:(?=“”“[^”]*“|(?!”)\w+

我正在尝试转换C#email正则表达式,这是我从

@^(?“”(“”)(“+?”?
但我得到的错误是:

:限定符的目标无效


?在.NET中,此正则表达式必须与
IgnorePatternWhitespace
IgnoreCase
标志一起使用,因为存在阻止匹配的空格。下面是一个示例

将正则表达式移植到JS时遇到的问题是由于JS正则表达式不支持lookbehinds和条件

JS有一个有条件的解决方法:.NET
(?(“”“[^”]*“|\w+)
可以翻译为
(?:(?=“”“[^”]*“|(?!”)\w+

lookbehind很难转换,但在这里,第一个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

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

您验证过度了。请使用更简单的表达式。毕竟,知道电子邮件地址是否真正有效的唯一方法是实际发送邮件。它是否与IgnorePatternWhitespace标志一起使用?我的建议是:搜索用JavaScript编写的类似正则表达式。互联网上有大量带有电子邮件正则表达式的网站。一代一代总而言之,这个
(?:\b |[^)]
是有问题的。它不仅将
[^)]
匹配除下划线以外的任何内容,而且如果不是单词边界,它将强制@symbol前面有一个以上的字符。
(?=\[)
(?!\[)
是不必要的,因为它们在替换集群中永远无法匹配。同意,这有点问题。由于原始正则表达式不允许
@gmail.com
我假设OP可以安全地使用
\b
而不是
[^\W\uuuuw]
。如果用户部分可以至少有2个符号,
[^\W\uuuu]
可以使用,这取决于需求。至于lookahead,它们是模拟条件构造所必需的。单词boundary
\b
单独使用是不起作用的,因为它匹配
hello_@world.com
,但期望
[a-z0-9]@
。而lookahead是打开的
[
可以工作,但不需要,因为这是一种典型的
^(?:\[+\[^\[]+)$
情况,在替换的右侧没有匹配的
[
。事实上,这两个条件一开始都是多余的。很可能这些条件没有必要,但我试图展示如何“模拟”现在,在JS.Now中,正则表达式将按预期工作。条件主要用于测试捕获的状态。它们实际上没有任何其他用途。在这方面,它不能在任何不支持测试捕获的引擎中进行模拟。此外,在正则表达式中,两个条件路径都有用的情况非常罕见。我认为,C#只在表达式condi中起作用没有任何构造,睫毛膏作为前瞻性断言,使它们几乎完全无用。
^(?(")(".+?"@)|(([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}))$
/^(?:(?=")("[^"\\]*(?:\\.[^"\\]*)*"@)|(?!")(([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