Regex для разделения пользовательской строки - PullRequest
3 голосов
/ 13 марта 2019

Мне нужно разделить пользовательскую строку, которая может выглядеть примерно так

[test1]-[test2]>>[test3]Some Text:[test4]|test:[test199]|some_text:[test0][test100]

И в конце я хочу получить список в js, который выглядит следующим образом

["[test1]", "-", "[test2]", ">>", "[test3]", "Some Text:", "[test4]", "|test:", "[test199]", "|some_text:", "[test0]", "[test100]"]

Поэтому я хочу, чтобы текст разделялся по переменным в скобках [] и всему, что не в скобках.

Проблема в том, что я могу получить решение только для всего, что в скобках []или более или менее статическое решение.

Все в [] скобках

(\[.*?\])

Не совсем правильное регулярное выражение

((\[.*?\]))|([a-zA-Z0-9->:|_ ]*(?!\]))

Это, например, не будет работать с текстомкак это

[test100

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Поскольку вам все равно, есть ли вложенные скобки или нет, вы можете использовать

s.split(/(\[[^\][]*])/).filter(Boolean)

Шаблон (\[[^\][]*]) сопоставляет и захватывает в Группу 1 a [, затем любые 0+ символов, отличные от [ и ], а затем ], и использует его для разбиения строки на куски при сохранении. и совпадающие, и не совпадающие фрагменты в результирующий массив.

Если есть смежные куски или они находятся в начале / конце строки, могут появляться пустые элементы, и .filter(Boolean) избавляется от них.

См. Демонстрацию JS:

console.log(
    "[test1]-[test2]>>[test3]Some Text:[test4]|test:[test199]|some_text:[test0][test100]"
        .split(/(\[[^\][]*])/).filter(Boolean)
)
1 голос
/ 13 марта 2019

Вы можете использовать положительные взгляды:

str = "[test1]-[test2]>>[test3]Some Text:[test4]|test:[test199]|some_text:[test0][test100]"

console.log(str.split(/(?<=\])|(?=\[)/))

(?<=\]): положительный вид сзади: поиск ] до разделения
(?=\[)/): положительный взгляд: поиск [ после разделения

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