В качестве параметра метод принимает регулярное выражение. Если вы хотите использовать текстовый разделитель, вы должны экранировать символы \ ^ $ . | ? * + ( ) [ {, поставив перед ними \.
String[] parts = string.split("\\|"); // Separar por "|"
String separador = Pattern.quote("|");
String[] parts = string.split(separador);
Возникли проблемы с использованием символа в качестве разделителя?
Существуют символы для «специального использования», называемые метасимволами .
Метасимволы — это неалфавитные символы, которые имеют особое значение в регулярных выражениях. Кто они такие :
\, ^, $, ., |, ?, *, +, (, ), {, },[
Если они используются непосредственно для разделения строки, они не будут работать должным образом, например:
String cadena = "Hola|Stackoverflow|en|español";
String[] parts = cadena.split("|");
System.out.println(Arrays.asList(parts));
Неправильный вывод:
[H, o, l, a, |, S, t, a, c, k, o, v, e, r, f, l, o, w, |, e, n, |, e, s, p, a, ñ, o, l]
эти символы должны быть экранированы перед символом "\", например:
String cadena = "Hola|Stackoverflow|en|español";
String[] parts = cadena.split("\\|");
System.out.println(Arrays.asList(parts));
Правильный вывод:
[Hola, Stackoverflow, en, español]
Чтобы применить разделитель в любом из случаев, можно использовать следующий метод, в котором определены строка и разделитель, если он обнаруживает, что символ-разделитель является метасимволом, он применяет escape:
private static String[] separaCaracteres(String cadena, String separator){
System.out.println("Separator: " + separator);
String[] parts = null;
if(separator.equals("|")|| separator.equals("\\")||separator.equals(".")||separator.equals("^")||separator.equals("$")
||separator.equals("?")||separator.equals("*")||separator.equals("+")||separator.equals("(")||separator.equals(")")
||separator.equals("{")||separator.equals("[")){
//Es metacaracter!
parts = cadena.split("\\"+separator);
}else{
//No es metacaracter.
parts = cadena.split(separator);
}
return parts;
}
Однако при splitего использовании мы должны учитывать некоторые вещи.
специальные символы
При разбиении любой строки мы должны учитывать, что этот метод принимает регулярное выражение , поэтому необходимо экранировать специальные символы , когда этого требует случай.
Есть 12 символов со специальными значениями: обратная косая черта \, квадрат ^, знак доллара $, точка ., вертикальная черта или символ трубы |, вопросительный знак ?, звездочка или звезда *, знак плюс +, открывающая скобка (, закрывающая скобка )и открывающая скобка [, открывающая скобка {. Эти специальные символы часто называют «метасимволами». ( см. эту ссылку )
Поэтому, если вы хотите разделить, например, эту строку: período/punto, что означает « любой символ » в регулярном выражении, используйте обратную косую черту \, чтобы экранировать отдельный специальный символ. Что-то вроде этого: split("\\.")либо используйте класс символов\[\] для представления буквенных символов, таких как split("[.]"), либо используйте Pattern#quote()для экранирования всей строки, например split(Pattern.quote (". ")).
String[] parts = string.split(Pattern.quote(".")); // Split on period.
Предварительный тест можно сделать
Чтобы заранее проверить, содержит ли строка определенные символы, используйте String#contains().
if (string.contains("-")) {
// Hacer split.
} else {
throw new IllegalArgumentException("String " + string + " no contiene -");
}
Но этот код не принимает регулярное выражение. Для этого используйте String#matches()вместо.
Сохранить символ деления в некоторых частях
Если вы хотите сохранить характер раздвоения в результирующих частях, используйте положительный внешний вид . Если вы хотите, чтобы разделительный символ располагался слева от последнего разделения, используйте положительный просмотр назад, добавляя префикс группы ?<=в шаблоне.
Если вы хотите, чтобы символ разделения был в конце справа от первого разделения, используйте положительный просмотр вперед, устанавливая префикс группы ?=в шаблоне.
Этот метод имеет два варианта и разбивает эту строку вокруг совпадений данного регулярного выражения.
Синтаксис этого метода будет следующим:
public String[] split(String regex)
Деталь параметра:
Regex - разделяющее регулярное выражение.
возвращаемое значение
Возвращает массив строк, вычисленный путем разделения этой строки на совпадения заданного регулярного выражения.
Пример
import java.io.*;
public class Test {
public static void main(String args[]) {
String Str = new String("123-654321");
System.out.println("Return Value :" );
for (String retval: Str.split("-")) {
System.out.println(retval);
}
}
}
Для этого используется метод,
String#split()
в котором вы определяете разделитель, который в случае этой строки равен"-"
.В качестве параметра метод принимает регулярное выражение. Если вы хотите использовать текстовый разделитель, вы должны экранировать символы
\ ^ $ . | ? * + ( ) [ {
, поставив перед ними\
.Или вы можете использовать метод
Pattern#quote()
.Возникли проблемы с использованием символа в качестве разделителя?
Существуют символы для «специального использования», называемые метасимволами .
Если они используются непосредственно для разделения строки, они не будут работать должным образом, например:
Неправильный вывод:
эти символы должны быть экранированы перед символом "\", например:
Правильный вывод:
Чтобы применить разделитель в любом из случаев, можно использовать следующий метод, в котором определены строка и разделитель, если он обнаруживает, что символ-разделитель является метасимволом, он применяет escape:
Пример вызова вышеуказанного метода:
Вылет из:
split()
это методНаиболее подходящим методом разделения строки является
String#split()
.Однако при
split
его использовании мы должны учитывать некоторые вещи.специальные символы
При разбиении любой строки мы должны учитывать, что этот метод принимает регулярное выражение , поэтому необходимо экранировать специальные символы , когда этого требует случай.
Есть 12 символов со специальными значениями: обратная косая черта
\
, квадрат^
, знак доллара$
, точка.
, вертикальная черта или символ трубы|
, вопросительный знак?
, звездочка или звезда*
, знак плюс+
, открывающая скобка(
, закрывающая скобка)
и открывающая скобка[
, открывающая скобка{
. Эти специальные символы часто называют «метасимволами». ( см. эту ссылку )Поэтому, если вы хотите разделить, например, эту строку:
período/punto
, что означает « любой символ » в регулярном выражении, используйте обратную косую черту\
, чтобы экранировать отдельный специальный символ. Что-то вроде этого:split("\\.")
либо используйте класс символов\[\]
для представления буквенных символов, таких какsplit("[.]")
, либо используйтеPattern#quote()
для экранирования всей строки, напримерsplit(Pattern.quote (". "))
.Предварительный тест можно сделать
Чтобы заранее проверить, содержит ли строка определенные символы, используйте
String#contains()
.Но этот код не принимает регулярное выражение. Для этого используйте
String#matches()
вместо.Сохранить символ деления в некоторых частях
Если вы хотите сохранить характер раздвоения в результирующих частях, используйте положительный внешний вид . Если вы хотите, чтобы разделительный символ располагался слева от последнего разделения, используйте положительный просмотр назад, добавляя префикс группы
?<=
в шаблоне.Если вы хотите, чтобы символ разделения был в конце справа от первого разделения, используйте положительный просмотр вперед, устанавливая префикс группы
?=
в шаблоне.Ограничьте количество результирующих частей
Если вы хотите ограничить количество результирующих частей, вы можете указать желаемое число в качестве второго аргумента метода
split()
.пустые строки
Бывают случаи, когда элементы возвращаемого массива String содержат пустые строки.
Префикс : - когда строка начинается с разделителя, первый элемент становится пустой строкой.
Это эквивалентно:
Середина : - каждое дополнительное появление разделителя в середине строки приведет к соответствующей пустой строке:
Это эквивалентно:
Суффикс : все вхождения разделителя в конце строки будут игнорироваться.
Это эквивалентно:
Однако мы можем заставить split считать все дополнительные разделители в конце строки, передав -1 в качестве предела:
Это эквивалентно:
Источники:
Три разных способа сделать это:
1. Использование функции
String.split()
:В этом решении используются регулярные выражения, поэтому оно не самое эффективное, если вы с ними не работаете.
2. Использование класса
StringTokenizer
:Проблема с этим методом в том, что он хорошо работает только тогда, когда разделитель имеет длину 1.
3. Реализуйте это, используя
String.indexOf()
:В этом случае он будет корректно работать для разделителей любой длины.
С помощью
StringTokenizer
: в конструкторе таких указываем разделитель "-",new StringTokenizer(nombre,"-");
метод split() строка метод split() строка
Этот метод имеет два варианта и разбивает эту строку вокруг совпадений данного регулярного выражения.
Синтаксис этого метода будет следующим:
Деталь параметра:
Regex - разделяющее регулярное выражение.
возвращаемое значение
Возвращает массив строк, вычисленный путем разделения этой строки на совпадения заданного регулярного выражения.
Пример
Это приведет к следующему выводу:
Что вы можете сделать, так это использовать метод
substring
, то есть извлекать определенные символы по их позиции или диапазону позиций.Если это не единственный формат, который вы используете, вы можете использовать метод
indexOf
, который поможет вам извлечь все, что идет после дефиса.Надеюсь, это поможет вам, это пример того, что я сделал с той же цепью
Важно отметить, что при выполнении .split() первый элемент начинается с [0]
Если результат не достигается разделителем, позиция [0] будет равна исходной строке