Regexp: сопоставить группу символов или конец строки
Как вы сопоставляете ^
(начало строки) и $
(конец строки) в []
(группа символов)?
простой пример
строка сена: zazty
правила:
- соответствуют любым "z" или "y"
- если предшествует
- "a", "b"; или
- в начале строки.
проход:
совпадают первые два "z"
regexp, который будет работать:
(?:^|[aAbB])([zZyY])
Но я продолжаю думать, что это было бы намного чище, с чем-то вроде начала/конца строки внутри группы персонажей
[^aAbB]([zZyY])
(в этом примере предполагается, что ^
означает начало строки, а не то, что на самом деле есть, отрицательный для группы символов)
Примечание: использование python. но зная, что на bash и vim тоже будет хорошо.
Обновление: снова прочитайте руководство, которое указано для набора символов, все потеряет особое значение, за исключением классов символов (например, \w
)
вниз в списке классов символов, там \A
для начала строки, но это не работает [\AaAbB]([zZyY])
Любая идея, почему?
Ответы
Ответ 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