Разделение строки с помощью 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);
Другие вопросы по тегам