Игнорировать разбиение регулярных выражений? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть строка, которая представляет собой комбинацию String и Regex. Я хочу разбить данную строку и сохранить ее в Array, но не хочу разбивать термины регулярных выражений. Regex может встречаться в любом месте строки. / обозначает начало и конец шаблона регулярного выражения.

Примеры:

  1. Hello world /[0-9]{4}[ K][a-z]{2}/
  2. /^[a-z]{5,10}/ meetings
  3. Start /[A-Z]) ^[0-9]{3}/ prepration

Это то, что у меня есть сейчас

private static final Pattern ignoreSpaceInRegex = 
            Pattern.compile("\\s+", Pattern.UNICODE_CHARACTER_CLASS);
public static String[] getEachWord(String givenString) {
    return ignoreSpaceInRegex.split(givenString);
}

1 Ответ

1 голос
/ 28 июня 2019

Вместо Pattern.split() вы можете переключить задачу на использование регулярного выражения, которое находит все слова в вашей строке.Поэтому вы можете использовать это регулярное выражение:

/[^/]+?/|\S+

Это соответствует либо регулярному выражению (предполагается, что оно начинается и заканчивается /), либо слову (без пробелов).Вот полный метод:

private static final Pattern FIND_WORDS_PATTERN =
        Pattern.compile("/[^/]+/|\\S+", Pattern.UNICODE_CHARACTER_CLASS);

public static List<String> getEachWord(String givenString) {
    List<String> words = new ArrayList<>();
    Matcher m = FIND_WORDS_PATTERN.matcher(givenString);
    while (m.find()) {
        words.add(m.group());
    }
    return words;
}

Результаты для вашего примера следующие:

  1. Hello world /[0-9]{4}[ K][a-z]{2}/:

    ["Hello", "world", "/[0-9]{4}[ K][a-z]{2}/"]
    
  2. /^[a-z]{5,10}/ meetings:

    ["/^[a-z]{5,10}/", "meetings"]
    
  3. Start /[A-Z]) ^[0-9]{3}/ prepration:

    ["Start", "/[A-Z]) ^[0-9]{3}/", "prepration"]
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...