假设我有一个子串BB,它可以是单独的,也可以是较长串的一部分,例如BB或AA | BB | CC或BB | CC或AA | BB,即如果它跟随/后跟另一个子串,它必须用|分开。在上面的任何一个中我需要找到什么正则表达式而不是AABB?
答案 0 :(得分:6)
答案 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));
}