Регулярное выражение продолжает находить символ, который я хочу сопоставить с предыдущим символом

#javascript #regex #string

#javascript #регулярное выражение #строка

Вопрос:

У меня есть следующее регулярное javascript выражение для операции разделения, поскольку я не могу выполнить отрицательный анализ, чтобы найти какие-либо разделители , в строке, которая не продолжается одним или несколькими управляющими символами .

[^\],

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

Например, если бы у меня была строка

hello,there,are

Результат будет e, соответствовать моему регулярному выражению, а не только , . Чтение массива разделенных строк

[hello,ther] [are]

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

Комментарии:

1. Потому что ваш reges состоит из 2 символов. 1-й символ, который он найдет, — это все, что не является обратной косой чертой, а 2-й символ будет запятой.

2. @anubhava прав, ваше регулярное выражение соответствует чему угодно, кроме « перед запятой.

3. @anubhava спасибо, вот что я подумал. Есть ли что-нибудь в javascript, кроме изменения строки, для достижения моей цели?

4. Вы не можете использовать split здесь, потому что вам понадобится lookbehind, который JS regex не поддерживает. Используйте a match с соответствующим регулярным выражением.

Ответ №1:

Вы не можете использовать split здесь, потому что вам понадобится lookbehind, который JS regex не поддерживает. Используйте совпадение с соответствующим регулярным выражением. Как показано ниже:

 /(?:[^\,]|\.) /g
 

Смотрите демонстрацию регулярных выражений.

Шаблон сопоставляет 1 или более последовательностей () любого символа, отличного от , и ( [^\,] ) или ( | ) любого экранированного символа (исключая символы разрыва строки) с \.

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

 var regex = /(?:[^\,]|\.) /g;
var str = "hello\,there,are";
var res = str.match(regex);
console.log(res); 

Комментарии:

1. Подождите… как это принято? Это не сработает, если вы используете string.split()

2. @musefan .split() не работает, но .match() все равно возвращает массив, как и просил OP.