Разбиение строки с использованием 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);