Разбиение строки с использованием Regex в Java
Кто-нибудь сможет мне помочь с некоторым регулярным выражением.
Я хочу разбить следующую строку на число, номер строки
"810LN15"
1 метод требует возврата 810, другой требует LN, а другой должен возвращать 15.
Единственное реальное решение этого - использовать регулярное выражение, поскольку числа будут увеличиваться в длину
Какое регулярное выражение можно использовать для его размещения?
Ответы
Ответ 1
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
Ответ 2
В 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]
Ответ 3
(\\d+)([a-zA-Z]+)(\\d+)
должен сделать трюк. Первая группа захвата будет первым номером, вторая группа захвата будет буквой между ними, а третья группа захвата будет вторым номером. Двойная обратная косая черта для java.
Ответ 4
Это дает вам то, о чем вы, ребята, ищете
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);