正则表达式找到子串

时间:2011-06-04 18:02:45

标签: java regex

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

4 个答案:

答案 0 :(得分:6)

我认为这样做会:

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

经过测试here我会说是的,就是这样。

答案 1 :(得分:4)

如果您的子字符串仅限于字母数字字符,则可以使用:

\bBB\b

如果他们不这样做,您可以使用lookarounds

模拟相同的内容
(?<=\||^)BB(?=\||$)

您的子串应位于管道之前和之后,或靠近边缘。

答案 2 :(得分: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前面/后跟一个管道或字符串的开头/结尾,我做的是等效的断言,它不是先于/后跟一个不是管道的角色。

答案 3 :(得分: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));
}