2011-06-04 71 views
5

假设我有一个子字符串BB,它可以是单独的或是一个较长字符串的一部分,例如, BB或AA | BB | CC或BB | CC或AA | BB,即如果它后面跟有另一个子字符串,它必须用|隔开。我需要什么样的正则表达式才能在上面的任何一个中找到BB,而不是在说AABB?正则表达式找到子字符串

+0

你是否试图找到一个字符串是否包含| BB |但不包括AABB,或者包含| BB |的字符串就够了忽略其余的?或者你想罚款所有| BB |的头寸在一个单一的字符串? – 2011-06-04 18:15:35

+0

我不明白。你想找到那些后面跟着'|'的地方吗?或那些没有跟着'|'的人 – Kaj 2011-06-04 18:23:47

+0

确保接受一个答案,如果有一个好的。它不需要是我的,但是一般情况下,如果你的答案满意,你就需要接受答案。 – 2011-06-08 18:44:57

回答

6

我想这会做到这一点:

^(.+[|])?BB([|].+)?$ 

和测试here后我会说是的,这是它。

+0

应该是最后一个'?'出现,因为他总是想要| BB后的BB – 2011-06-04 18:16:48

+0

其实我也是这么想的。然而,这个问题只是说“BB”必须在两侧都有一个“|”。它没有提到其他字符串。所以我关心的是它是'BLAHBLAHBLAH | BB | BLAHBLAHBLAH'。 – 2011-06-04 18:18:27

+0

为什么'[|]'?只需使用'\ |' – Eric 2011-06-05 12:13:38

4

如果你的字符串将被限制为字母数字字符,你CA使用:

\bBB\b 

如果他们不这样做,你可以使用lookarounds模拟相同:

(?<=\||^)BB(?=\||$) 

你子应该是前并在管道之后或靠近边缘。

+0

“如果您的子字符串仅限于字母数字字符...” - * ASCII *字母数字,即。但我认为无论如何,这种环视方法更为正确。看看我的变化,但。这并不比你的更好,只是一个心灵扩张的练习。 ;) – 2011-06-04 20:06:54

0

不知道它是否是您想要的位置,但是这会捕获BB开始和结束的位置,如果BB后跟“|”或串的两端:

String data = "AA|BB|CCBBCC|BB"; 
Matcher m = Pattern.compile("(BB)(?:\\||$)").matcher(data); 
while (m.find()) { 
    System.out.println(m.group(1) + " starts at " + m.start() + " ends at " + m.end(1)); 
} 
+0

你需要封闭前端和后端。就像这样,你的正则表达式将匹配'BBB','ABB','BBB | CC'等中的最后两个'B',我不认为OP需要这样做。 – 2011-06-04 19:53:45

+0

不确定OP真正需要的是什么,但是他没有提到任何有关'ABB'中的'BB'是否应该匹配的内容。(是的,我的表情把它当作匹配) – Kaj 2011-06-04 20:25:29

3

这里的另一种选择:

Pattern p = Pattern.compile("(?<![^|])BB(?![^|])"); 

String[] input = { "AABB", "BB", "AA|BB|CC", "BB|CC", "AA|BBB", "BBB|AA" }; 
for (String s : input) 
{ 
    Matcher m = p.matcher(s); 
    System.out.printf("%-10s : %b%n", s, m.find()); 
} 

输出:

AABB  : false 
BB   : true 
AA|BB|CC : true 
BB|CC  : true 
AA|BBB  : false 
BBB|AA  : false 

这实际上是一样的@了Kobi的答案,但如果他的说法的BB IS之前/后面跟着一个管道或字符串的开始/结尾,我做了一个等同的断言,说它没有在一个不是管道的字符之前/之后。

+0

奇怪。我总是翻转查看字符串的开始/结束到相反的lookareand,但无法让这个工作。 (哦 - 我有'[^ |]'匹配换行符!) – Kobi 2011-06-04 20:42:18

+0

是的,这也行得通。谢谢 – user580459 2011-06-09 16:48:49

相关问题