#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());
}
Дополнительный пробел перед входом выполняет две функции:
- Позволяет определять
.
как первый символ входной строки - Смещает
matcher.start()
на единицу, чтобы учесть символ перед сопоставляемым.
Результатом является:
15
18
Ответ №2:
добавьте пробел в начале и в конце строки, а затем используйте шаблон
"[^\.]\.[^\.]"
Комментарии:
1. И добавьте пробел в конце тоже … 🙂
Ответ №3:
вам нужно использовать отрицательные обходные пути.
Что-то вроде Pattern.compile("(?<!\.)\.(?!\.)");
Комментарии:
1. Амаль, не могла бы ты объяснить шаблон. Я не понимаю, как использовать <!
2. выражение соответствует символу ‘.’, которому не предшествует символ ‘.’ и за которым не следует символ ‘.’. Ссылаться http://www.regular-expressions.info/lookaround.html
Ответ №4:
Попробуйте
Pattern.compile("(?<=[^\.])\.(?=[^\.])")
или даже лучше…
Pattern.compile("(?<![\.])\.(?![\.])")
При этом используется отрицательный поиск.
(?<![\.])
=> не предшествует .
\.
=> a .
(?![\.])
=> не за которым следует .