регулярное выражение для поиска подстроки - PullRequest
5 голосов
/ 04 июня 2011

Скажем, у меня есть подстрока BB, которая может быть одна или частью более длинной строки, например BB или AA | BB | CC или BB | CC или AA | BB, то есть, если за ним следует / следует другая подстрока, она ДОЛЖНА быть разделена знаком |. Какое регулярное выражение мне нужно, чтобы найти BB в любом из вышеперечисленных, но не в, скажем, AABB?

Ответы [ 4 ]

6 голосов
/ 04 июня 2011

Я думаю, что это сделает это:

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

И после тестирования здесь Я собираюсь сказать, да, это оно.

4 голосов
/ 04 июня 2011

Если ваши подстроки ограничены буквенно-цифровыми символами, вы можете использовать:

\bBB\b

Если нет, вы можете смоделировать то же самое, используя lookarounds :

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

Ваша подстрока должна быть до и после трубы или около краев.

3 голосов
/ 04 июня 2011

Вот еще один вариант:

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

output:

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

Это фактически то же самое, что и ответ @ Kobi, но там, где он говорит, BB IS предшествует / сопровождаетсятруба или начало / конец строки, я делаю эквивалентное утверждение, что она НЕ предшествует / следует за символом, который НЕ является трубой.

0 голосов
/ 04 июня 2011

Не знаю, хотите ли вы эту позицию, но она фиксирует, где начинается и заканчивается 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...