2013-10-12 183 views
2

我的问题很简单。对那些了解RegEx的人很简单,不幸的是,我不是。 所以,请帮助我。我有String。比方说,"java @[email protected] test @[email protected]"。 我应该用什么正则表达式,如果只有我需要的匹配为:在字符串中获取字符串

1. @[email protected] 
2. @[email protected] 

我尝试这样表达(@(.*)@),但结果是:

1. "@[email protected] bang @[email protected] 
2. [email protected] bang @bb 

这是我所需要的路太远。

P.S. 另外,我不希望匹配@@或这两个@符号内的空字符串。

+0

应该正则表达式匹配呢? “java @aa bb @” –

回答

2

在我看来,最好的办法是

@[^@][email protected] 

它看起来像:

Regular expression visualization

Debuggex Demo

可以也使用非贪婪.+?,但是当你的分隔符是只有一个字符(在这种情况下@),你平时应该喜欢否定字符类方法。

顺便说一下,学习正则表达式的好资源是regular-expressions.info。它从最基本的开始,一直到最先进的。如果您有兴趣了解有关正则表达式的更多信息,我强烈建议您浏览一下。当然,也有Java专用的Oracle lesson on regular expressions;两者都很棒。


String str = "java @[email protected] test @[email protected]"; 

Matcher m = Pattern.compile("@[^@][email protected]").matcher(str); 
while (m.find()) 
    System.out.println(m.group()); 
 
@[email protected] 
@[email protected] 
+0

将“aa”仅留下@@使匹配错误。如果我需要的模式是@(应该在这里)@,我应该使用什么样的正则表达式? –

+0

@ GM-XileGM-喜乐我将取代'+'和'*'和滤除情况下,有是'@之间没有什么能够手动。它应该只回落到检查,如果本场比赛的长度等于2,因为你知道你必须有一个'@'开始和一个结尾。 – arshajii

+0

我也想过手动做。无论如何谢谢你的帮助。 –

1

量词默认为贪婪。 .*将消耗一切,直到最后@。为了使之停止在第一@,你需要使用不愿意量词:

@[email protected] 

或者也可以是否定的字符类会工作:

@[^@][email protected] 
+0

谢谢你的回答。但我忘了说我不希望有像@@那样的结果。应该有@@里面的东西。 –

+0

@ GM-XileGM,喜乐就变成'+'” –

+0

我改变了字符串到Java @@测试@ BBB @量词,但现在的比赛是@@测试@。如果我需要像“@(在这里的字符串)@”的结果,我应该使用什么正则表达式? –

1

两个选项:使用非贪婪或使用否定的类。

非贪婪是由?.*加发:

@(.*?)@ 

取反类是利用一切手段,不是一个@

@([^@]*)@ 

第二个是由方式更快。

其实还有第三个办法:

(?<[email protected])[^@]*([email protected]) 

但是,这可能是一个多一点很难理解。


在我看来,你不明白正则表达式。也许需要更多的解释。

.在正则表达式中会匹配任何字符,除非它被转义或用在字符类中,它将被视为字面字符。

在正则表达式*是量词,其允许先前模式的匹配0次或多次;这意味着,如果没有什么相匹配的,是“无”将被匹配,并在你的情况下,两个@@@之间什么也不会匹配,让你得到一个空字符串作为结果。

+类似于*,不同之处在于代替匹配0次或更多次,则1次或多次匹配时,这意味着它可以确认存在要被匹配的至少1个字符。在你的情况下,用这个量词使用第二个正则表达式(带有否定类)会更有意义:@([^@]+)@

(...)是一个捕获组,如果存在匹配,它将存储里面的内容。尽量限制这些使用,因为它会消耗更多的内存,否则你的脚本/程序会使用它。

[ ... ]是一个字符类将匹配内提到的任何字符。很多的正则表达式元字符内失去了意义,并且字符类有自己的特殊字符:^其在这里将意味着,如果放置在字符类的开始字符的对面;和-意味着一系列角色,如果它没有被挖掘或角色类的末端。

[^ ... ]如上所述是否定类,它将匹配除字符类中的所有字符。

(?= ...)是一个积极的向前看,只有当里面的模式与之前的比赛相匹配时才会进行比赛,而不会在比赛中对他们进行计数。

(?<= ...)是一个积极的lookbehind,只有当内部模式匹配之前匹配的内容时才会进行匹配,而不会在匹配它们自己的时候对它们进行计数。


从这些,如果你不想让空匹配,使用:

@([^@]+)@ 

或者:

(?<[email protected])[^@]+([email protected]) 

由于@(.+?)@形式也将允许在@字符比赛。

+0

@ GM-XileGM-喜乐添加更深入的说明,以正则表达式的字符,组和类。 – Jerry

2

。*是贪婪的。你应该试试 。*?

如果你把?那么REG EXP将停在第一个@,否则它不会停止,直到它maches最后@(这是贪婪)

+0

感谢您的解释,但您能否给我一个表达式,其中这两个@符号内总会有一个字符串? –