Соответствие подстроки между двумя специальными символами ИСКЛЮЧЕНИЕ символов - PullRequest
5 голосов
/ 11 июля 2019

Итак, я хочу захватить подстроку между двумя специальными символами в JavaScript, используя регулярные выражения. Скажем, у меня есть строка "$Hello$, my name is $John$", я бы хотел, чтобы .match возвращал массив [Hello, John]. * Кроме того, я не хочу захватывать матч между двумя матчами. Так что я бы не хотел фиксировать $, меня зовут $, так как технически он находится между двумя $.

Я использовал регулярное выражение

var test = str.match(/(?<=\$)(.*)(?=\$)/);

Что работает, но дублирует каждую запись дважды. Так оно и есть [Привет, Привет, Джон, Джон]. Я также использовал var test = str.match(/(?<=\$)[^\$]+?(?=\$)/g) Но это возвращает все, что находится между каждым соответствием (в примере, который я перечислил выше, $, меня зовут $.)

Как я могу это исправить?

Ответы [ 3 ]

2 голосов
/ 11 июля 2019

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

\$([^$]+)\$

Regex demo

Вместо использования соответствия вы можете использовать exec . Например:

var str = "$Hello$, my name is $John$";
var regex = /\$([^$]+)\$/g;
var m;
var test = [];

while ((m = regex.exec(str)) !== null) {
  // This is necessary to avoid infinite loops with zero-width matches
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  test.push(m[1]);
}

console.log(test);
1 голос
/ 11 июля 2019

Мне удалось получить желаемые совпадения с помощью /(?<=\$)[^$ ]+(?=\$)/g.

. Оно будет сопоставлять каждое слово между двумя знаками доллара, но опирается на два предположения.Во-первых, $ не может появляться в качестве символа в предложении, например, $Your$ total is $4.50, cash or $card$.Во-вторых, в знаках доллара никогда не будет пробела, например $Hello$, my name is $John Smith$.Пока это работает, ты должен идти.

0 голосов
/ 11 июля 2019

Может достигнуть этого, не используя вид сзади:

(?:.*?\$(.*?)\$) /g

Все, что я делаю, - это лениво ищу $, а затем лениво собираю все, пока не встретится следующий $. Это повторяется несколько раз с помощью флага /g. Каждая группа захвата будет иметь желаемую строку.

Демо

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