Java Regex Help: Разделение строки на пробелы, "=>" и запятые - PullRequest
11 голосов
/ 07 сентября 2010

Мне нужно разбить строку на любую из следующих последовательностей:

1 или более пробелов
0 или более пробелов, за которыми следует запятая, за которыми следуют 0 или более пробелов,
0или больше пробелов, за которыми следует «=>», за которыми следуют 0 или более пробелов

До этого у меня не было опыта выполнения регулярных выражений Java, поэтому я немного запутался.Спасибо!

Пример:
добавить r10, r12 => r10
сохранить r10 => r1

Ответы [ 3 ]

32 голосов
/ 07 сентября 2010

Просто создайте регулярное выражение, соответствующее любому из трех вариантов, и передайте его в split метод:

string.split("\\s*(=>|,|\\s)\\s*");

Regex здесь означает буквально

  1. Ноль или более пробелов (\\s*)
  2. Стрелка, или запятая, или пробел (=>|,|\\s)
  3. Ноль или более пробелов (\\s*)

Вы можете заменить пробел \\s (обнаруживает пробелы, табуляции, разрывы строк и т. Д.) На простой символ , если необходимо.

16 голосов
/ 07 сентября 2010

Строго переводится

Для простоты я собираюсь интерпретировать указание на "пробел" () как "любой пробел" (\s).

Перевод вашегоБолее или менее "слово в слово" - это разделение любого из:

  • 1 или более пробелов
    • \s+
  • 0 или более пробелов (\s*), за которыми следует запятая (,), за которыми следуют 0 или более пробелов (\s*)
    • \s*,\s*
  • 0 или более пробелов (\s*), за которыми следует "=>" (=>), за которыми следуют 0 или более пробелов (\s*)
    • \s*=>\s*

Для соответствия любому из вышеперечисленного: (\s+|\s*,\s*|\s*=>\s*)

Сокращенная форма

Однако, ваша спецификация может быть "уменьшена" до:

  • 0 или более пробелов
    • \s*,
  • , за которыми следует пробел, запятая или "=>"
    • (\s|,|=>)
  • , за которыми следуют 0 или более пробелов
    • \s*

Соберите все вместе: \s*(\s|,|=>)\s*

Сокращенная форма обходит некоторые угловые случаи со строго переведенной формой, которая делает неожиданные пустые «совпадения».

Код

Вот некоторый код:

import java.util.regex.Pattern;

public class Temp {

    // Strictly translated form:
    //private static final String REGEX = "(\\s+|\\s*,\\s*|\\s*=>\\s*)";

    // "Reduced" form:
    private static final String REGEX = "\\s*(\\s|=>|,)\\s*";

    private static final String INPUT =
        "one two,three=>four , five   six   => seven,=>";

    public static void main(final String[] args) {
        final Pattern p = Pattern.compile(REGEX);
        final String[] items = p.split(INPUT);
        // Shorthand for above:
        // final String[] items = INPUT.split(REGEX);
        for(final String s : items) {
            System.out.println("Match: '"+s+"'");
        }
    }
}

Вывод:

Match: 'one'
Match: 'two'
Match: 'three'
Match: 'four'
Match: 'five'
Match: 'six'
Match: 'seven'
3 голосов
/ 07 сентября 2010
String[] splitArray = subjectString.split(" *(,|=>| ) *");

должен это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...