Просмотр вперед и назад в Java
Иногда условие для поиска находится рядом с нужным фрагментом, но само не должно попадать в замену. Для этого в регулярных выражениях используют просмотр вперед и назад.
Позитивный просмотр вперед (?=...)
проверяет, что после найденного фрагмента стоит
нужный текст. В следующем примере заменяется
только "aaa" перед "x":
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String txt = "aaax aaab";
Pattern pattern = Pattern.compile("aaa(?=x)");
String res = pattern.matcher(txt).replaceAll("!");
System.out.println(res);
}
}
Негативный просмотр вперед (?!...)
делает обратную проверку: после фрагмента не
должно быть указанного текста. Теперь заменится
"aaa" не перед "x":
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String txt = "aaax aaab";
Pattern pattern = Pattern.compile("aaa(?!x)");
String res = pattern.matcher(txt).replaceAll("!");
System.out.println(res);
}
}
Позитивный просмотр назад (?<=...)
проверяет текст перед фрагментом. В Java такие
шаблоны записывают в строке как обычную регулярку:
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String txt = "xaaa baaa";
Pattern pattern = Pattern.compile("(?<=x)aaa");
String res = pattern.matcher(txt).replaceAll("!");
System.out.println(res);
}
}
Негативный просмотр назад (?<!...)
проверяет, что перед найденным фрагментом нет
указанного текста:
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String txt = "xaaa baaa";
Pattern pattern = Pattern.compile("(?<!x)aaa");
String res = pattern.matcher(txt).replaceAll("!");
System.out.println(res);
}
}
Дана строка, содержащая имена функций:
String txt = "func1() func2 test()";
Найдите имена, после которых сразу идут круглые скобки, и выведите их списком.
Дана строка с ценами:
String txt = "$10 20 $30";
Найдите числа, перед которыми стоит знак доллара, и выведите их списком.