Разделение строки с помощью Regex в Java - PullRequest
12 голосов
/ 07 апреля 2011

Кто-нибудь сможет мне помочь с каким-нибудь регулярным выражением.

Я хочу разбить следующую строку на число, строковое число

"810LN15"

1 методдля возврата требуется 810, для другого требуется LN, а для другого - 15.

Единственное реальное решение этого вопроса - использование регулярных выражений, поскольку числа будут увеличиваться в длину

Какие регулярные выражения можно использовать для размещенияэто?

Ответы [ 4 ]

17 голосов
/ 07 апреля 2011

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
10 голосов
/ 07 апреля 2011

В 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]
7 голосов
/ 07 апреля 2011

(\\d+)([a-zA-Z]+)(\\d+) должен сделать свое дело.Первая группа захвата будет первым числом, вторая группа захвата будет буквами между ними, а третья группа захвата будет вторым числом.Двойная обратная косая черта для Java.

0 голосов
/ 29 июня 2017

Это дает вам именно то, что вы, ребята, ищете

        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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...