Выражение RegEx для разделения строки на запятую с условием в JavaScript - PullRequest
2 голосов
/ 18 марта 2020

Я очень новичок в выражениях RegEx, и проблема в том, что я хочу разбить строку с некоторыми условиями, используя RegEx. Допустим, я хочу разделить запятыми, но если за этим не следуют некоторые определенные вещи. В следующем примере показано все:

str = "a , b=10 , c=add(3,b) , d"
certainThings = ["add" , "sub"]

вывод str.split(','), который разделяется только запятой: ["a" , "b=10" , "c=add(3" , "b)" , "d"].

Но я не хочу делить на 3-ю запятую как за ним следует один из элементов массива certainThings.

Ожидаемый результат: ["a" , "b=10" , "c=add(3,b)" , "d"].

Возможным решением может быть разделение запятой и объединение двух элементов, если prior содержит один элемент массива certainThings. Но я думаю, что должен быть лучший способ сделать это с помощью выражений RegEx.

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Предполагая, что вам когда-либо придется беспокоиться об исключении запятых в однорядных скобках, мы можем попробовать разбить на следующий шаблон регулярных выражений:

\s*,\s*(?![^(]*\))

Это означает разделение на запятую, окруженное с обеих сторон необязательным пробелом, пока мы не можем смотреть вперед и встречаем закрывающую скобку ) без также , в которой впервые появляется открывающая (. Эта логика c исключает запятую внутри c=add(3,b), потому что эта конкретная запятая сначала попадает на ), не видя открывающей (.

var str = "a , b=10 , c=add(3,b) , d"
parts = str.split(/\s*,\s*(?![^(]*\))/);
console.log(parts);
0 голосов
/ 18 марта 2020

Вместо разделения на запятую вы также можете выбрать все, что не является запятой:

const str = "a , b=10 , c=add(3,b) , d";
const regex = /(?:\([^)]*\)|[^,])+/g;

console.log(
  str.match(regex).map(str => str.trim())
);

regex diagram

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