Java 正则表达式来查找子字符串

Java 正则表达式来查找子字符串,java,regex,Java,Regex,假设我有一个子串BB,它可能是单独的,也可能是较长字符串的一部分,例如BB或AA | BB | CC或BB | CC或AA | BB,即如果它后跟/后跟另一个子串,则必须用|分隔。我需要什么正则表达式才能在上面的任何一个中找到BB,而不是在AABB中 我认为这样做可以: ^(.+[|])?BB([|].+)?$ 测试后,我会说是的,就是这样。如果子字符串仅限于字母数字字符,则可以使用: \bBB\b 如果没有,您可以使用以下方法模拟相同的情况: (?不知道它是否是您想要的位置,但如果BB后面

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

我认为这样做可以:

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

测试后,我会说是的,就是这样。

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

\bBB\b
如果没有,您可以使用以下方法模拟相同的情况:


(?不知道它是否是您想要的位置,但如果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));
}
还有一个选择:

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() );
}

这实际上与@Kobi的答案相同,但如果他说
BB
前面/后面有一个管道或字符串的开头/结尾,我会做出一个等价的断言,即它前面/后面没有一个不是管道的字符。

你是想找出一个字符串是否包含| BB |而不是AABB,还是stri就足够了ng包含| BB |忽略其余的?或者你想在一个字符串中对所有| BB |的位置进行微调?我不明白。你想找到后面跟|的还是后面不跟|的答案?如果有好的答案,一定要接受。答案不需要是我的,但一般来说,如果答案已经被回答,你需要接受让你满意。最后一个
应该出现吗?因为他总是想在BB之后抄送其实我也想到了。但是问题只是说
BB
必须在两边都有一个
。它没有提到其他字符串。所以我只关心它是
BLAHBLAHBLAH | BB | BLAHBLAHBLAH
@Eric:6 of一打,半打other@Chris:我以前从未见过用于转义字符的
[]
。@Eric:这只是一个字符类。[]中的任何字符将匹配一次。是的,我可以同样轻松地使用
\\\
,但我使用了字符类。剥猫皮的方法不止一种。你需要封住前端和后端。事实上,你的正则表达式将匹配
BBB
ABB
BBB
CC
等中的最后两个
B
,我不这么认为nk OP想要那个。不确定OP真正想要什么,但他没有说关于
ABB
中的
BB
是否应该匹配。(是的,我的表达式将其视为匹配)“如果子字符串仅限于字母数字字符…”-就是ASCII字母数字。但我认为环顾法更正确。尽管如此,看看我的变体。它并不比你的好,只是一个思维扩展练习。;)奇怪。我总是将检查字符串开始/结束的lookarounds翻转到相反的lookarounds,但无法使其工作。(哦,我有
[^ |]
匹配新行!)
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