Ваш шаблон соответствует, потому что «абзац» не совпадает с «абзац [пробел]». Ваш шаблон не имеет пробела. Ваш текст делает.
Вы можете добавить пробел (возможно, условно?) К вашему взгляду. Поскольку вы хотите соответствовать различному числу X.X.X.X
(вы сказали, что от X.X
до X.X.X.X.X
), нам необходимо включить X.
также и в просмотр:
const rex = /(?<!paragraph *(?:[\(\)0-9a-zA-Z]+\.)*)(?:[\(\)0-9a-zA-Z]+\.){1,4}[\(\)0-9a-zA-Z]/i;
Live Example :
function test(str) {
const rex = /(?<!paragraph *(?:[\(\)0-9a-zA-Z]+\.)*)(?:[\(\)0-9a-zA-Z]+\.){1,4}[\(\)0-9a-zA-Z]/i;
const match = rex.exec(str);
console.log(match ? match[0] : "No match");
}
console.log("Testing four 'digits':");
test("Don't want to match paragraph 1.2.3.4 but this instead 5.6.7.8 blah");
console.log("Testing two 'digits':");
test("Don't want to match paragraph 1.2.3.4 but this instead 5.6 blah");
console.log("Testing two 'digits' again:");
test("Don't want to match paragraph 1.2 but this instead 5.6 blah");
console.log("Testing five 'digits' again:");
test("Don't want to match paragraph 1.2 but this instead 5.6.7.8.9 blah");
Для этого выражения требуется:
- Что
paragraph
, за которым следует ноль или более пробелов, возможно, за которыми следует X.
ноль или более раз не непосредственно перед матчем; и - , что
X.
повторяется от одного до четырех раз ({1,4}
); и - То, что
X
следует сразу за этими тремя
X
в моем примере A-Z0-9
, и я сделал выражение без учета регистра, но вы можете настроить как Нужен.
Обратите внимание, что lookbehind был добавлен только в JavaScript недавно, в ES2018, поэтому для поддержки требуется современная JavaScript среда. Если вам нужно смотреть назад в более старых средах, вы можете проверить превосходную библиотеку XRegex Стивена Левитана .
Также обратите внимание, что внешний вид переменной длины, как указано выше, поддерживается не во всех языках (но поддерживается в JavaScript ... в современных двигателях).