Разделение строки с помощью Regex в Java
Кто-нибудь сможет помочь мне с некоторым регулярным выражением.
Я хочу разбить следующую строку на число, номер строки
"810LN15"
1 метод требует возврата 810, другой требует LN, а другой должен вернуть 15.
Единственное реальное решение для этого - использовать регулярные выражения, так как числа будут расти в длине.
Какое регулярное выражение я мог использовать, чтобы приспособить это?
4 ответа
String.split
не даст вам желаемого результата, который, я думаю, будет "810", "LN", "15", так как он должен будет искать токен, на который нужно разделиться, и удалит этот токен.
Пытаться Pattern
а также Matcher
вместо этого, используя это регулярное выражение: (\d+)|([a-zA-Z]+)
, которая будет соответствовать любой последовательности цифр и букв и получать различные группы цифр / текста (т. е. "AA810LN15QQ12345" приведет к группам "AA", "810", "LN", "15", "QQ" и "12345").).
Пример:
Pattern p = Pattern.compile("(\\d+)|([a-zA-Z]+)");
Matcher m = p.matcher("810LN15");
List<String> tokens = new LinkedList<String>();
while(m.find())
{
String token = m.group( 1 ); //group 0 is always the entire match
tokens.add(token);
}
//now iterate through 'tokens' and check whether you have a number or text
В Java, как и в большинстве разновидностей регулярных выражений (Python является заметным исключением), split()
Регулярное выражение не требуется для использования каких-либо символов, когда оно находит совпадение. Здесь я использовал lookaheads и lookbehinds для соответствия любой позиции, у которой на одной стороне есть цифра, а на другой - не цифра:
String source = "810LN15";
String[] parts = source.split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)");
System.out.println(Arrays.toString(parts));
выход:
[810, LN, 15]
(\\d+)([a-zA-Z]+)(\\d+)
должен сделать свое дело. Первая группа захвата будет первым числом, вторая группа захвата будет буквами между ними, а третья группа захвата будет вторым числом. Двойная обратная косая черта для Java.
Это дает вам именно то, что вы, ребята, ищете
Pattern p = Pattern.compile("(([a-zA-Z]+)|(\\d+))|((\\d+)|([a-zA-Z]+))");
Matcher m = p.matcher("810LN15");
List<Object> tokens = new LinkedList<Object>();
while(m.find())
{
String token = m.group( 1 );
tokens.add(token);
}
System.out.println(tokens);