RegEx совпадение с исключением в нем - PullRequest
1 голос
/ 03 мая 2020

Я ищу способ сопоставления с исключениями в нем. Например, я хочу соответствовать ab-3/3/6, но я не хочу соответствовать ab-4/2/5:34. Кроме того, если ab-4/2/5:34 существует ... Я вообще не хочу сопоставлять его.

Для этого решения я строю следующее регулярное выражение: ab-\d{1,2}\/\d{1,2}\/\d{1,2}[^:]

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

ab-3/3/6
ab-4/2/5:34
ab-6/1/4

Мое совпадение содержит только ab-3/3/6.
То, что он не найден ab-4/2/5 - это то, что я хочу заархивировать.
Но ab-6/1/4 отсутствует, потому что за ним нет персонажа.

Может кто-нибудь помочь мне найти решение этой проблемы?

Ответы [ 3 ]

2 голосов
/ 06 мая 2020

Вместо отрицательного класса символов , вам нужно использовать отрицательный взгляд позади . Тем не менее, поскольку последний шаблон перед lookbehind определен количественно, а длина совпадения шаблона неизвестна, механизм регулярных выражений может backtrack и соответствовать строке, которую вы могли бы потерпеть неудачей. Это означает, что вы не можете просто заменить [^:] на (?!:).

Пример строки, которую не следует сопоставить, может быть ab-3/3/6987: /\bab-\d{1,2}\/\d{1,2}\/\d{1,2}(?!:)/ перехватит 69 с последним \d{1,2}, а затем (?!:) опережает, что 8 не :, и вернет «ОК». Вы получите ab-3/3/69 совпадение.

Вам нужно либо использовать границу слова перед заглядыванием (если следующий символ не может быть буквой, di git или _), либо вы можете просто добавьте \d к :, т.е. используйте (?![:\d]) (тогда вы получите совпадения до буквы или _).

Итак, используйте либо

\bab-\d{1,2}\/\d{1,2}\/\d{1,2}(?![:\d])
//                            ^^^^^^^^^   
\bab-\d{1,2}\/\d{1,2}\/\d{1,2}\b(?!:)
//                            ^^^^^^^

См. regex demo # 1 и regex demo # 2 . Посмотрите, как они ведут себя по-разному с дополнительными входами.

1 голос
/ 03 мая 2020

Отрицательный класс символов соответствует любому символу, кроме перечисленного, который является :, но он ожидает, что символ будет там (например, пробел или символ новой строки или другой ди git)

Вы можете начать совпадение с границей слова \b, чтобы ab не являлся частью более длинного слова, и завершить шаблон отрицательным прогнозом (?!:), утверждающим, что нет : после 1 или 2 цифр.

\bab-\d{1,2}\/\d{1,2}\/\d{1,2}(?!:)

См. Демоверсию regex

0 голосов
/ 03 мая 2020

Ваше регулярное выражение может быть: /ab-\d{1,2}\/\d{1,2}\/\d{1,2}(?<!:)$/

Образец:

const dateStr = `ab-3/3/6
ab-4/2/5:34
ab-6/1/4`;

const matchAll = (str) => {
  let m;
  const reg = /ab-\d{1,2}\/\d{1,2}\/\d{1,2}(?<!:)$/gm;
  let result = [];
  do {
    m = reg.exec(str);
    if (m) {
      result.push(m[0]);
    }
  } while (m);
  return result;
};
console.log(matchAll(dateStr));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...