Как изменить RegExp, чтобы избежать последней точки в URL

1

Это мой RegExp:

const urlReg = /((\w*?)((:\/\/)|www|\w\.{1}\w{2,})[^"<\s]+)(?![^<>]*>|[^"]*?<\/a)/g;

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

Я исключил URL-адрес в тегах, поэтому у меня есть только одна проблема с последней точкой в этом URL-адресе: https://testask.com/item/45e20490-2b86-4b6a-8772-5ed96f64de52. Кто-нибудь знает, как изменить мой RegExp, чтобы избежать этой точки?

  • 1
    Так ты хочешь чтобы это не поймало точку?
  • 0
    Пожалуйста, задайте более четкий вопрос: покажите нам, что должно делать ваше регулярное выражение: что оно должно проверять, что не должно проверять. Это может значительно помочь пользователям понять ваш вопрос и решить его быстрее!
Показать ещё 2 комментария
Теги:

1 ответ

0
Лучший ответ

Если вы правильно поняли, оскорбительный случай - это второе совпадение в вашем примере, в котором есть. на и в матче. С регулярным выражением PCRE можно было легко решить это с помощью lookbehind assertion (?<!\.):

((\w*?)((:\/\/)|www|\w\.{1}\w{2,})[^"<\s]+(?<!\.))(?![^<>]*>|[^"]*?<\/a)

К сожалению, это не работает в (текущем) JavaScript regex engine. В качестве альтернативы мы можем использовать (?:(?!avoid).)+ Шаблон, чтобы исключить добавление точки перед вашим внутренним все, но шаблон [^"<\s]+, однако он становится немного беспорядочным, так как у вас есть использовать несколько чередований, отсортированных по длине (длинный до коротких), для учета случая, когда есть окончательный . before <|"|\s:

((\w*?)((:\/\/)|www|\w\.{1}\w{2,})(:?(?!\.\s|\s|\."|"\.<|<).)+)(?![^<>]*>|[^"]*?<\/a)

const regex = /((\w*?)((:\/\/)|www|\w\.{1}\w{2,})(:?(?!\.\s|\s|\."|"\.<|<).)+)(?![^<>]*>|[^"]*?<\/a)/g;
const str = 'djfhjkshd fjkshkdjfhsjkdhfjk jdsfh ksjdfksd fkdsf dkfh kjh<br>You can open your link here: https://testask.com/item/45e20490-2b86-4b6a-8772-5ed96f64de52. dsjfklj skldjfklsdjfkl. dsjfjshdfjk skdhfshdfj skdhfjshfjsahfjhasjfh shfk.<br>sdkfhklsdjf kljsdklf kdsljfkljafkljkl .';
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++;
    }  
    console.log(m[0]);
    // The result can be accessed through the 'm'-variable.
    //m.forEach(match => {
    //    console.log('Found match: ${match}');
    //});
}

Однако самое простое решение - просто обрезать конечную точку.

  • 0
    Большое спасибо за помощь, ваш второй пример RegExp работает отлично.
  • 0
    @MichaelLonin, добро пожаловать. Просто примечание: если у вас есть проблемы с производительностью, обрежьте вместо этого, как намекнуло.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню