Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvSpRgHHy 71 of 322 menu
◀ ▶

Особенности дефиса внутри наборов в Java

Дефис - тоже спецсимвол внутри [ ] (а вот снаружи - нет). Если вам нужен сам дефис как символ - то поставьте его там, где он не будет воспринят как разделитель группы.

Почему это важно: вы можете сделать группу символов, сами не заметив этого. К примеру, вот так - '[:-@]' - вы думаете, что выбираете двоеточие, дефис и собаку, а на самом деле получается группа символов между : и @. В эту группу входят следующие символы: ? < = > :

Откуда они взялись? Из таблицы ASCII - двоеточие имеет номер меньше, чем собака - и получается группа. To есть все группы получаются по таблице ASCII (при желании этим можно пользоваться).

Как с этим бороться: поставьте символ дефиса там, где он точно не будет воспринят как символ группы, например, в начале или в конце (то есть после [или перед ]).

Можно также заэкранировать дефис - тогда он будет обозначать сам себя независимо от позиции. Например, вместо [:-@] написать [:\-@] - и группы уже не будет, а будут три символа - двоеточие, дефис и собака @.

В следующем примере шаблон поиска такой: цифра 1, затем буква от 'a' до 'z', затем цифра 2:

import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String txt = "1a2 1-2 1c2 1z2"; Pattern pattern = Pattern.compile("1[a-z]2"); Matcher matcher = pattern.matcher(txt); String res = matcher.replaceAll("!"); System.out.println(res); } }

Результат выполнения кода:

"! 1-2 ! !"

Теперь заэкранируем дефис. В результате шаблон поиска такой: цифра 1, затем буква 'a', или дефис, или буква 'z', затем цифра 2:

import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String txt = "1a2 1-2 1c2 1z2"; Pattern pattern = Pattern.compile("1[a\\-z]2"); Matcher matcher = pattern.matcher(txt); String res = matcher.replaceAll("!"); System.out.println(res); } }

Результат выполнения кода:

"! ! 1c2 !"

Можно просто переставить дефис, не экранируя его:

import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String txt = "1a2 1-2 1c2 1z2"; Pattern pattern = Pattern.compile("1[az-]2"); Matcher matcher = pattern.matcher(txt); String res = matcher.replaceAll("!"); System.out.println(res); } }

Результат выполнения кода:

"! ! 1c2 !"

В следующем примере шаблон поиска такой: первый символ - это маленькие буквы или дефис '-', потом две буквы 'x':

import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String txt = "axx Axx -xx @xx"; Pattern pattern = Pattern.compile("[a-z-]xx"); Matcher matcher = pattern.matcher(txt); String res = matcher.replaceAll("!"); System.out.println(res); } }

Результат выполнения кода:

"! Axx ! @xx"

В следующем примере шаблон поиска такой: первый символ - это маленькие, большие буквы или дефис '-', потом две буквы 'x':

import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String txt = "axx Axx -xx @xx"; Pattern pattern = Pattern.compile("[a-zA-Z-]xx"); Matcher matcher = pattern.matcher(txt); String res = matcher.replaceAll("!"); System.out.println(res); } }

Результат выполнения кода:

"! ! ! @xx"

Можно расположить дефис между двумя группами - там он точно еще не сделает еще одну группу:

import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String txt = "axx 9xx -xx @xx"; Pattern pattern = Pattern.compile("[a-z-0-9]xx"); Matcher matcher = pattern.matcher(txt); String res = matcher.replaceAll("!"); System.out.println(res); } }

Результат выполнения кода:

"! ! ! @xx"

Дана строка:

public class Main { public static void main(String[] args) { String txt = "xaz xBz xcz x-z x@z"; } }

Найдите все строки по следующему шаблону: буква 'x', большая или маленькая буква или дефис, буква 'z'.

Дана строка:

public class Main { public static void main(String[] args) { String txt = "xaz x$z x-z xcz x+z x%z x*z"; } }

Найдите все строки по следующему шаблону: буква 'x', затем или доллар, или дефис или плюс, потом буква 'z'.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить