Как ограничить регулярное выражение совпадением только с неповторяющимися словами - PullRequest
1 голос
/ 03 июня 2019

У меня есть следующее регулярное выражение: ((\b\/?counter\b)[^\/]){1}

Я хочу сопоставить слово /counter, которое оно соответствует, но также соответствует /counter/counter, которое я не хочу. Я не хочу много говорить о том, что будет после /counter, если это не косая черта. Я просто хочу убедиться, что есть только один случай /counter

Что я делаю не так?

enter image description here

Регулярное выражение: https://regex101.com/r/7bHqRk/1/ Что следует принять:

/counter
/counter?

Что не следует принимать:

counter
/counter/counter
counter/

EDIT:

В моем вопросе было непонятно, но что-либо до /counter должно быть принято, если это не противоречит самой себе. Так что http://localhost/controller1/counter в порядке, а http://localhost/counter/counter не

Ответы [ 3 ]

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

Если вы хотите сопоставить /counter в начале строки, вы можете использовать:

^/counter\b

Если /counter не может произойти впоследствии, но что-то может произойти раньше, вы можете использовать подход с жадным жетоном с умеренным давлением, чтобы сопоставить что-либо до первого появления /counter, и после этого утверждать, что это больше не происходит, используя отрицательный Lookahead (?!:

^(?:(?!/counter\b).)*/counter\b(?!.*/counter\b)

Regex demo

1 голос
/ 03 июня 2019

Упростите ваш шаблон, чтобы использовать начальный символ строки (^) и отрицательный прогноз (?!), чтобы гарантировать, что /counter не сопровождается ни одной обратной косой чертой (/).

^\/counter(?!\/)

Regex101

Соответствует:

/ счетчик
/ Счетчик?

Не соответствует:

счетчик
/ counter / counter
счетчик /
/ counter /
/ Счетчик / счетчик / счетчик

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

Это выражение будет просто разделять их, и мы можем сделать то, что мы хотим сделать после их захвата:

.+(counter).\1|(.+)

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

.+(counter).\1

тогда вторая часть будет содержать то, что нам нравится:

(.+)

Демо

Тест

const regex = /.+(counter).\1|(.+)/gm;
const str = `http://localhost/controller1/counter
http://localhost/counter/counter`;
const subst = `$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

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