Terser RegExp, чтобы поймать коллекцию альтернатив сгруппированных слов - PullRequest
1 голос
/ 14 июня 2019

Я хотел бы поймать слова ferrari, ferry и ferret.

Регулярное выражение может быть легко:

/ferr(ari|y|et)/

Однако я заметил закономерность: когда вы хотите захватить несколько вариантов одного слова, вы можете использовать квадратную скобку [wordsToCapture]. Например, я хотел бы поймать слова: vowel a, vowel e, vowel u, vowel o, vowel i.

Регулярное выражение может быть: vowel [aeiou], которое имеет меньше шума, чем vowel (a|e|i|o|u)

Поэтому я попытался использовать квадратную скобку, чтобы поймать несколько вариантов сгруппированных слов . Тем не менее, [...] (квадратная скобка) делает мою группу захвата ((...) круглую скобку) бесполезной, то есть, если я использую это регулярное выражение ferr[(ari)(y)(et)], вместо этого оно будет соответствовать: ferr(, ferra, ferrr , ferri, и список продолжается для каждого одного из символов, представленных в квадратной скобке .

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

Ответы [ 3 ]

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

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

Тот, который может бытьполезно знать, если вам это нужно, это не захватывая, например так:

/ ferr (?: ari | y | et) /

Есть хорошее объяснение этого здесь .

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

Нет - квадратные скобки обозначают набор символов. Если вы хотите сопоставить несколько групп букв, вам нужно использовать нотацию, которую вы использовали ранее.

/ferr(ari|y|et)/
0 голосов
/ 14 июня 2019

Технически, есть способы сделать это, но, возможно, в этом нет необходимости, в зависимости от того, чего мы хотим достичь:

ferr[a]?[r]?[i]?[y]?[e]?[t]?

Демонстрация 1

ДругоеПримеры:

ferr[ar]?[i]?[y]?[e]?[t]?
ferr[ar]?[iy]?[e]?[t]?
ferr[ar]?[iy]?[et]?

Для ferrari, ferret и ferry с использованием класс char , что было бы возможно, но чрезмерно:

ferr([a][r][i]|[e][t]|[y])
ferr(ari|et|y)

Демо

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