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

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


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

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

правила:

  1. соответствуют любым «z» или «y»
  2. , если им предшествует
    1. an «а», «б»; или
    2. в начале строки.

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

, регулярное выражение, которое будет работать, выглядит так:
(?: ^ | [aAbB]) ([zZyY])

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


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

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

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

Есть идеи, почему?

28
задан Alan Moore 29 January 2016 в 06:07
поделиться

1 ответ

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

ОБНОВЛЕНИЕ: Если вы хотите найти все Z и As, перед которыми стоит «a», вы можете использовать положительный взгляд назад. Вероятно, нет никакого способа указать подстановочные знаки в группах символов (потому что подстановочные знаки тоже являются символами). (Если бы я был рад узнать об этом).

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
0
ответ дан 28 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: