2017-01-09 45 views
2

我需要确保指定字符(@)连续重复不超过一次。它可以发生多次,但仅作为单个@字符,而不是@@或更多。捕获组是不必要的。匹配连续不超过@个字符的字符串

这些字符串应该匹配:

foobar 
@foobar 
[email protected] 
[email protected]@baz 

这些字符串不应该匹配:

@@foobar 
[email protected]@bar 
[email protected]@@baz 

该引擎支持向前看符号和lookbehinds。

我已经试过用(?<[email protected])@([email protected])这样做了1次重复,但是((?<[email protected])@([email protected])|)(?<[email protected])@?([email protected])显然不会按照0或1次重​​复的意图工作。

这种情况怎么处理?

+0

如果一行没有任何@字符怎么办?它应该匹配还是不匹配? –

+1

@ S.Imp它应该。这种情况列在*这些字符串应该匹配*。 – estus

+3

堆栈溢出不是免费的为您创建正则表达式的咨询。你尝试了什么,它是怎么出错的,你做了什么来尝试解决这个问题? –

回答

5

没有任何先行的支持,你可以使用这个否定的字符类的正则表达式:

^[^@]*(?:@[^@]+)*$ 

[^@]匹配任何不@

RegEx Demo

如果在您的正则表达式有前瞻的支持,然后使用一个简单的正则表达式:

^(?!.*@@).*$ 

哪里(?!.*@@)为负正则表达式字符串不允许@@任何地方。

RegEx Demo 2

+1

优秀。非常感谢。 – estus