Найти! [Изображение] (URL) с помощью регулярных выражений - PullRequest
3 голосов
/ 09 ноября 2019

Ввод: This is my image url: ![image](www.example.com/images/abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefg)

Выход Expetec: This is my image url: too long

Я пытался

string.replace(/\![^)]*\)/g,'too long')

, который заменяет строку с ! на ). Но я считаю, что замена строки с ![image]( на ) будет более точной. Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 09 ноября 2019

Метод 1

Может быть, здесь может работать простое совпадение и конкат:

const regex = /^[^:]+:/gm;
const str = `This is my image url: ![image](www.example.com/images/abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefg)`;
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(match.concat(' too long'));
    });
}

Если вы хотите упростить / изменить / изучить выражение, это объяснено на верхней правой панели regex101.com . Если хотите, вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.


Метод 2

Если у вас естьнекоторые другие подобные контексты в ваших входных данных, мы можем попробовать более ловкое выражение, если это будет необходимо:

const regex = /(.+?)(!\[image\]\s*\((?:https?)?(?:w{3}\.)?[^)]*\))/gm;
const str = `This is my image url: ![image](www.example.com/images/abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefg)`;
const subst = `$1too long`;

const result = str.replace(regex, subst);

console.log(result);

Демонстрация 2


Метод 3

Может быть ненужным, но еще одно предположениетоже:

const regex = /.+?(?=!\[image\]\s*\((?:https?)?(?:w{3}\.)?[^)]*\))/gm;
const str = `This is my image url 1: ![image](www.example.com/images/abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefg)
 
This is my image url 2: ![image](https://www.example.com/images/abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefg)`;
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++;
    }
    
    m.forEach((match, groupIndex) => {
        console.log(match.concat(' too long'));
    });
}

Демо 3

1 голос
/ 09 ноября 2019

Попробуйте !\[image\]\([^)]+\)

Объяснение:

! - соответствует ! буквально

\[image\] - соответствует [image] буквально

\( - соответствует ( буквально

[^)]+ - соответствует одному или нескольким другим символам из )

\) - соответствует ) буквально

и изменить его с помощью: too long.

Демо

1 голос
/ 09 ноября 2019

Попробуйте следующее:

\!\[[^\]\]]+\]\(([^\)]*)\)

Разбивка:

  • \! Соответствует символу !
  • \[[^\]]+\] Соответствует [символ, некоторый текст и символ ]
  • \(([^\)]+) Соответствует символу (, затем создайте CAPTURE GROUP для содержимого скобок, а затем )

Затем вы можете получить прямой доступ к этой группе захвата (URL-адрес будет группа захвата # 1; группа захвата # 0 - это полная строка в том виде, в каком она была найдена).

Вы можете протестировать это регулярное выражение в режиме реального времени. в Regexr , где вы также можете навести курсор мыши на результаты, чтобы найти различные группы и то, как они интерпретируются регулярным выражением.

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