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