Как написать команду регулярного выражения, которая соответствует нескольким разделителям, включая любое количество пробелов, но не пробел (ы) между знаком равенства? - PullRequest
1 голос
/ 10 июня 2019

Я прочитал много постов и обнаружил, что, похоже, look-behind не поддерживается регулярным выражением JS. Есть ли способ, которым я все еще могу выполнить эту часть, чтобы исключить сопоставление любых равных символов с любым количеством пробелов перед или после него?

Пока что я получил \s+|,|\(|\)|(?! \s*?=) это регулярное выражение будет соответствовать всем разделителям, таким как любое количество пробелов, ",", "(" или ")", но не будет работать должным образом для последней части, где я хочу исключить любые пробелы, найденные до или после = символ.

поэтому момент, когда я это сделал (?! \s*?=), - это когда весь ад вспыхнул Тем не менее, я вижу, что если я просто использую \s*?= с каналом, он на самом деле соответствует any equal symbols with any number of spaces in front or after it.

песочница: https://regexr.com/4fgop

Есть ли способ, которым я все еще могу сделать это в JavaScript?

Пример (с помощью регулярного выражения с STRING.split(regexrulehere))

Строка ввода: my-app command, arg1 arg2 arg3 =val1, arg4 = val2)

Ожидаемый результат:

[
'my-app',
'command',
'arg1',
'arg2',
'arg3=val1', // or `arg3   =val1` is fine as well
'arg4=val2', // or `arg4 = val2` is fine as well
]

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

У вас есть пробелы около = во входной строке, и вы не можете ожидать получить arg4=val2 (без пробелов) после одного split.

Сделайте это в два шага "regex":

s = s.replace(/\s*=\s*/g, '=').match(/[^\s,()]+/g)

\s*=\s* соответствует любым пробелам 0+, = и пробелам 0+, и этот replace удаляет все пробелы вокруг =. .match(/[^\s,()]+/g) извлечет все фрагменты 1+ символов, кроме пробелов, ,, ( и ) символов, поскольку [^...] является отрицательным классом символов .

JS демо:

var s = "my-app command, arg1 arg2 arg3=val1, arg4=val2)";
console.log(s.replace(/\s*=\s*/g, '=').match(/[^\s,()]+/g));

Если вы хотите разделить, используйте

s.replace(/\s*=\s*/g, '=').split(/[\s,()]+/).filter(Boolean)

Обратите внимание, что filter(Boolean) требуется для удаления пустых элементов, если таковые имеются.

0 голосов
/ 10 июня 2019

Поскольку вы заявляете, что включение пробельных символов также хорошо, другой вариант может заключаться в том, чтобы не совпадать с круглыми скобками, запятой, знаком равенства или пробельным символом с использованием отрицательного класса символов [^\s(),=]+.

Затем следуйте совпадению с помощью необязательной части (?:....)?, которая соответствует знаку равенства в окружении пробельных символов, и снова используйте класс отрицанных символов:

[^\s(),=]+(?:\s*=\s*[^\s(),=]+)?

Regex demo

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