我在带有转义字符的c#上有这个正则表达式
^((?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@)))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$
或者这没有逃避角色
^(?(")(".+?(?<!\\)"@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`{}|~\w])*)(?<=[0-9a-z])@)).{1.64}(?([)([(\d{1,3}.){3}\d{1,3}])|(([0-9a-z][-0-9a-z]*[0-9a-z]*.)+[a-z0-9][-a-z0-9]{0,22}[a-z0-9]))$
我希望能够限制@之前的电子邮件的第一部分长度为64个字符。我试着积极向前看,但它没有用。
在每个(?<=^.{1,64}@)
之后添加@
正面lookbehind。在@
之前,它将需要1至64个字符串。
模式字符串看起来像
^((?(")(".+?(?<!\\)"@(?<=^.{1,64}@))|(([0-9a-z]((\.(?!\.))|[-!#$%&'*+/=?^`{}|~\w])*)@(?<=[0-9a-z]@)(?<=^.{1,64}@))))(?(\[)(\[(?:\d{1,3}\.){3}\d{1,3}])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][-a-z0-9]{0,22}[a-z0-9]))$
注意我在(?<=[0-9a-z])
之后移动@
,同时将@
添加到环视中,只有在@
已经匹配以简化内部匹配过程时才执行检查。
在逐字字符串文字中使用字符串时,只需将双引号加倍:
var pattern = @"^((?("")("".+?(?<!\\)""@(?<=^.{1,64}@))|(([0-9a-z]((\.(?!\.))|[-!#$%&'*+/=?^`{}|~\w])*)@(?<=[0-9a-z]@)(?<=^.{1,64}@))))(?(\[)(\[(?:\d{1,3}\.){3}\d{1,3}])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][-a-z0-9]{0,22}[a-z0-9]))$";