Подтвердить что ты не робот

Regexp: сопоставить группу символов или конец строки

Как вы сопоставляете ^ (начало строки) и $ (конец строки) в [] (группа символов)?


простой пример

строка сена: zazty

правила:

  • соответствуют любым "z" или "y"
  • если предшествует
    • "a", "b"; или
    • в начале строки.

проход: совпадают первые два "z"

regexp, который будет работать:
(?:^|[aAbB])([zZyY])

Но я продолжаю думать, что это было бы намного чище, с чем-то вроде начала/конца строки внутри группы персонажей
[^aAbB]([zZyY])
 (в этом примере предполагается, что ^ означает начало строки, а не то, что на самом деле есть, отрицательный для группы символов)


Примечание: использование python. но зная, что на bash и vim тоже будет хорошо.

Обновление: снова прочитайте руководство, которое указано для набора символов, все потеряет особое значение, за исключением классов символов (например, \w)

вниз в списке классов символов, там \A для начала строки, но это не работает [\AaAbB]([zZyY])

Любая идея, почему?

4b9b3361

Ответ 1

Вы не можете сопоставить ^ или $ внутри [], потому что только символы со специальным значением внутри символьного класса ^ (как в "все, кроме" ) и - (as в "диапазоне" ) (и классы символов). \A и \Z просто не считаются символьными классами.

Это для всех (стандартных) ароматов регулярного выражения, поэтому вы застряли с (^|[stuff]) и ($|[stuff]) (это не так уж плохо, правда).

Ответ 2

Совместите символ 'a' с началом строки. Затем используйте [aAbB]([zZyY]).

Ответ 3

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

(?<![^abAB])([yzYZ])

Ответ 4

Почему бы не попробовать escape-символ \? ([\^\$])

UPDATE: Если вы хотите найти все Zs и As, которым предшествует "a", чем вы можете использовать положительный lookbehind. Вероятно, нет способа указать "дикие" карты в группах персонажей (поскольку дикие карты также являются символами). (Это есть, я был бы рад узнать об этом).

private static final Pattern PATTERN = Pattern.compile("(?<=(?:^|[aA]))([zZyY])");

public static void main(String[] args) {
    Matcher matcher = PATTERN.matcher("zazty");

    while(matcher.find()) {
        System.out.println("matcher.group(0) = " + matcher.group(0));
        System.out.println("matcher.start() = " + matcher.start());
    }
}

Вывод:

matcher.group(0) = z
matcher.start() = 0
matcher.group(0) = z
matcher.start() = 2