регулярные выражения в java

#java #regex

#java #регулярное выражение

Вопрос:

Как проверить выражение для символа с одной точкой? Например, если у меня есть выражение "trjb....fsf..ib.bi." , то оно должно возвращать только точки с индексами 15 и 18. Если я использую шаблон p=Pattern.compile("(\.) "); , я получаю

 4 ....
11 ..
15 .
18 .
  

Ответ №1:

Кажется, это помогает:

 String input = "trjb....fsf..ib.bi.";
Pattern pattern = Pattern.compile("[^\.]\.([^\.]|$)");
Matcher matcher = pattern.matcher(" "   input);
while (matcher.find()) {
    System.out.println(matcher.start());
}
  

Дополнительный пробел перед входом выполняет две функции:

  1. Позволяет определять . как первый символ входной строки
  2. Смещает matcher.start() на единицу, чтобы учесть символ перед сопоставляемым .

Результатом является:

 15
18
  

Ответ №2:

добавьте пробел в начале и в конце строки, а затем используйте шаблон

 "[^\.]\.[^\.]"
  

Комментарии:

1. И добавьте пробел в конце тоже … 🙂

Ответ №3:

вам нужно использовать отрицательные обходные пути.

Что-то вроде Pattern.compile("(?<!\.)\.(?!\.)");

Комментарии:

1. Амаль, не могла бы ты объяснить шаблон. Я не понимаю, как использовать <!

2. выражение соответствует символу ‘.’, которому не предшествует символ ‘.’ и за которым не следует символ ‘.’. Ссылаться http://www.regular-expressions.info/lookaround.html

Ответ №4:

Попробуйте

Pattern.compile("(?<=[^\.])\.(?=[^\.])")

или даже лучше…

Pattern.compile("(?<![\.])\.(?![\.])")

При этом используется отрицательный поиск.

(?<![\.]) => не предшествует .

\. => a .

(?![\.]) => не за которым следует .