Отрицательный взгляд на группу захвата - PullRequest
6 голосов
/ 03 июня 2019

Я пытаюсь написать какое-нибудь регулярное выражение, которое позволит мне негативно взглянуть на группу захвата, чтобы я мог извлечь возможные ссылки из электронных писем.Мне нужно знать, как смотреть назад от определенной точки к первому пустому месту.Если найдена цифра, я не хочу, чтобы ссылка была извлечена.

Я получил так далеко, как показано ниже.У меня есть 2 группы захвата - «PreRef» и «Ref».Я не хочу, чтобы совпадение «Ref» было найдено, если «PreRef» содержит цифру.То, что у меня есть, пока только проверяет, является ли символ непосредственно перед двоеточием цифрой.

(?<PreRef>\S+)(?<![\d]):(?<Ref>\d{5})

Здесь можно найти совпадение «Ref» 12345:

This is a reference:12345

Но не здесь (в слове «ссылка» 5):

This is not a ref5rence:12345

Ответы [ 3 ]

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

Вы можете исключить цифры из класса \S, затем окружить выражение
пробелами, затем альтом ..

(?<!\S)(?<PreRef>[^\s\d]+):(?<Ref>\d{5})(?!\S)

https://regex101.com/r/JrU7Kd/1

Объяснил

 (?<! \S )                     # Whitespace boundary
 (?<PreRef> [^\s\d]+ )         # (1), Not whitespace nor digit
 :                             # Colon
 (?<Ref> \d{5} )               # (2), Five digits
 (?! \S )                      # Whitespace boundary
2 голосов
/ 03 июня 2019

Вам нужен отрицательный взгляд сзади?Проще просто исключить цифры из захвата PreRef.[^\W\d] будет соответствовать символам слова, но не цифрам.Затем вам просто нужно добавить \b или другое подобное утверждение границы слова, чтобы убедиться, что совпадающее слово является полным словом.

\b(?<PreRef>[^\W\d]+):(?<Ref>\d{5})
1 голос
/ 03 июня 2019

Я, безусловно, согласен с Джоном , и мы можем использовать простое выражение, если цифры не допускаются до :, например:

^\D+:(\d{5})

или:

^\D+:(\d{5})$

Если мы хотим добавить больше границ, мы тоже можем это сделать.

Демо

RegEx Circuit

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

enter image description here

Тест

const regex = /^\D+:(\d{5})/gm;
const str = `This is a reference:12345
This is not a ref5rence:12345`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...