Regex: соответствует персонажу, который имеет четное количество обратных косых черт перед ним - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужен RegEx, который соответствует определенному символу, если перед этим символом задано количество (или не имеет) обратной косой черты.

Например:

*       #match the character *
\*      #no match
\\*     #match the character *
\\\*    #no match
\\\\*   #match the character *

Я пробовалследующий RegEx: (?<!\\)(?:\\\\)*\*, но соответствует всей последовательности (например, \\*), а не только персонажу *.

Вот моя игровая площадка: https://regex101.com/r/2HLpY0/1

1 Ответ

0 голосов
/ 14 февраля 2019

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

(?<=\s|^)(?:\\{2})*(\*)(?=\s|$)

Это будет соответствовать только четному числуведущие обратные слеши.Ниже я использую формальное сопоставление с образцом, потому что оно позволяет нам изящно обрабатывать случай, когда совпадение не найдено.

String input = "Hello World! \\\\\\\\* more content here? \\\\*";
String pattern = "(?<=\\s|^)(?:\\\\{2})*(\\*)(?=\\s|$)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(input);

boolean found = false;
while (m.find()) {
    found = true;
    System.out.println(m.group(1));
}
if (!found) {
    System.out.println("No match");
}

Вывод:

*
*
(two asterisks found in the input)

Обратите внимание, чтоиспользование String#replaceAll не так хорошо, как описано выше, поскольку в случае несоответствия оно вернет исходную входную строку.

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