两个选项:使用非贪婪或使用否定的类。
非贪婪是由?
到.*
加发:
@(.*?)@
取反类是利用一切手段,不是一个@
:
@([^@]*)@
第二个是由方式更快。
其实还有第三个办法:
(?<[email protected])[^@]*([email protected])
但是,这可能是一个多一点很难理解。
在我看来,你不明白正则表达式。也许需要更多的解释。
.
在正则表达式中会匹配任何字符,除非它被转义或用在字符类中,它将被视为字面字符。
在正则表达式*
是量词,其允许先前模式的匹配0次或多次;这意味着,如果没有什么相匹配的,是“无”将被匹配,并在你的情况下,两个@
在@@
之间什么也不会匹配,让你得到一个空字符串作为结果。
+
类似于*
,不同之处在于代替匹配0次或更多次,则1次或多次匹配时,这意味着它可以确认存在要被匹配的至少1个字符。在你的情况下,用这个量词使用第二个正则表达式(带有否定类)会更有意义:@([^@]+)@
(...)
是一个捕获组,如果存在匹配,它将存储里面的内容。尽量限制这些使用,因为它会消耗更多的内存,否则你的脚本/程序会使用它。
[ ... ]
是一个字符类将匹配内提到的任何字符。很多的正则表达式元字符内失去了意义,并且字符类有自己的特殊字符:^
其在这里将意味着,如果放置在字符类的开始字符的对面;和-
意味着一系列角色,如果它没有被挖掘或角色类的末端。
[^ ... ]
如上所述是否定类,它将匹配除字符类中的所有字符。
(?= ...)
是一个积极的向前看,只有当里面的模式与之前的比赛相匹配时才会进行比赛,而不会在比赛中对他们进行计数。
(?<= ...)
是一个积极的lookbehind,只有当内部模式匹配之前匹配的内容时才会进行匹配,而不会在匹配它们自己的时候对它们进行计数。
从这些,如果你不想让空匹配,使用:
@([^@]+)@
或者:
(?<[email protected])[^@]+([email protected])
由于@(.+?)@
形式也将允许在@
字符比赛。
应该正则表达式匹配呢? “java @aa bb @” –