Regex для уценки Акцент - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь сопоставить следующий текст уценки для акцента:

_this should match_
__this shouldn't__
_ neither should this _
_nor this _
this _should match_as well_
__       (double underscore, shouldn't match)

Проблема, с которой я сталкиваюсь своими собственными усилиями, а также другими решениями для SO, состоит в том, что они все равно заканчиваются тем, что совпадают третья строка:

_ neither should this _

Есть ли способ проверить мой конкретный вариант использования? Я нацеливаюсь на это для браузерных приложений, и поскольку Firefox и Safari еще не поддерживают lookbehinds , есть ли способ сделать это без lookbehinds?

Вот шаблон регулярного выражения, который я до сих пор придумали: /(_)((?!\1|\s).*)?\1/

К счастью, я могу выполнить почти все свои проверки, однако мой шаблон все еще совпадает:

_nor this _
__       (double underscore, shouldn't match)    

Итак, есть ли способ убедиться, что между подчеркиванием есть хотя бы один символ и что они не отделены от текста пробелом?

Ссылка на игровую площадку regexr: regexr.com / 5300j

Пример:

const regex = /(_)((?!\1|\s).*)?\1/gm;
const str = `_this should match_
__this shouldn't__
_ neither should this _
_nor this _
this _should match_as well_
__
_ neither should this _`;
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}`);
    });
}

1 Ответ

1 голос
/ 22 апреля 2020

Вы можете использовать любой из

\b_(?![_\s])(.*?[^_\s])_\b
\b_(?![_\s])(.*?[^_\s])_(?!\S)

См. Демоверсию regex

Подробности

  • \b - нельзя использовать слово char (буква, ди git, _) непосредственно перед матчем
  • _ - подчеркивание
  • (?![_\s]) - нет _ или Пробельные символы допускаются сразу после _
  • (.*?[^_\s]) - Группа 1:
    • .*? - любые 0 или более символов, кроме символов разрыва строки, как можно меньше
    • [^_\s] - любой 1 символ, кроме _ и пробела
  • _ - подчеркивание
  • \b - без слова разрешен символ после _.

Обратите внимание, что (?!\S) не удается найти совпадение, если сразу справа от текущего местоположения нет непробельного символа и действует как правая граница пробела.

...