Хорошо, давайте начнем с числа штука.Это нормально, за исключением того, что технически нет необходимости заключать в скобки один символ [5]
[1-9] | [1-4][0-9] | 5[0-7]
(используйте пробелы здесь и ниже для ясности).
Для первой части, изменение вроде a | ab
читается лучше, когда написано как ab?
, то есть «a, а затем, необязательно, b`. Это дает нам
< \/ ?
Теперь« и »(или, скорее,« и тогда ») оператор, который вы искали, очень прост в языке регулярных выражений - это ничего. То есть a and then b
- это просто ab
.
Однако, если объединить обе части просто, как это
a x | y | z
это было бы ошибкой, потому что |
имеет низкий приоритет, так что это будет интерпретироваться как
ax | y | z
, что не то, что мы хотим. Поэтому нам нужно поместить число вПарены, по причинам, которые будут объяснены ниже, эти парены также должны быть не захватывающими:
<\/? (?: [1-9] | [1-4][0-9] | 5[0-7] )
Это соответствует нашим разделителям, но нам также нужно все промежуточное, поэтому мы собираемся split
входные данные. split
обычно возвращает массив строк, которые не соответствуютch разделитель:
"a,b,c".split(/,/) => a b c
Если мы тоже хотим включить разделитель, его нужно поместить в группу захвата:
"a,b,c".split(/(,)/) => a , b , c
, поэтому нам нужно один раз обернуть все в пареныеще раз:
( <\/? (?: [1-9] | [1-4][0-9] | 5[0-7] ) )
и в этом причина ?:
- мы хотим, чтобы все это было записано, а не числовая часть.
Соединение всего этого, похоже, помогает:
s = "This is a<21>test</21>."
console.log(s.split(/(<\/?(?:[1-9]|[1-4][0-9]|5[0-7])>)/))
Надеюсь, это проливает свет