0

这是我的正则表达式:

"^[^\.]([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)([\.]{0,1})([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)[^\.]@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$"

我只需要匹配少于 255 个字符的字符串。

我尝试在 RegEx 的开头添加单词边界,但失败了:

"^(?=.{1,254})[^\.]([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)([\.]{0,1})([\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]+)[^\.]@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$"
4

3 回答 3

3

您需要前瞻中的 $ 以确保它最多只能达到 254。否则,即使超过 254,前瞻也会匹配。

(?=.{1,254}$)

另外,请记住,您可以大大简化您的正则表达式,因为通常需要转义的许多字符在字符类(方括号)中不需要转义。

"[\w-\!\#\$\%\&\'\*\+\-\/\=\`\{\|\}\~\?\^]"

与此相同:

"[-\w!#$%&'*+/=`{|}~?^]"

请注意,破折号必须在字符类的第一个才能成为文字破折号,并且插入符号不能是第一个。

通过其他一些简化,这里是完整的字符串:

"^(?=.{1,254}$)[-\w!#$%&'*+/=`{|}~?^]+(\.[-\w!#$%&'*+/=`{|}~?^]+)*@((\d{1,3}\.){3}\d{1,3}|([-\w]+\.)+[a-zA-Z]{2,6})$"

笔记:

  • 我删除了第一个字符不应该是句点([^.])的规定,因为下一个字符类无论如何都不匹配句点,所以它是多余的。
  • 我删除了许多无关的括号
  • 我用 \d 替换了 [0-9]
  • 我将 {0,1} 替换为简写“?”
  • @ 符号后,您似乎在尝试匹配 IP 地址或文本域名,所以我将它们分开了,所以它不可能是组合
  • 我不确定末尾的可选方括号是做什么用的,所以我删除了它:“(]?)”

我在 Regex Hero 中尝试过,它可以工作。看看它是否适合你。

于 2013-05-01T16:03:34.820 回答
2

这取决于您使用的语言。例如,在 Python 中,您可以使用正则表达式将文本拆分为单独的字符串,然后使用 len() 删除长度超过 255 个字符的字符串

于 2013-05-01T16:03:44.290 回答
1

我认为这篇文章会有所帮助。它显示了如何限制某些模式,但我不确定如何将它添加到整个正则表达式中。

于 2013-05-01T16:05:27.887 回答