如何在^
(字符组)中匹配$
(行首)和[]
(行尾)?
简单的例子
haystack string:zazty
规则:
通: 匹配前两个“z”
可行的正则表达式是:
(?:^|[aAbB])([zZyY])
但是我一直认为用类似意味着字符组内的开头/结尾的东西会更清晰
[^aAbB]([zZyY])
(在该示例中假设^
表示行的开头,而不是它的真实位置,对于字符组是负的)
注意:使用python。但是知道在bash和vim上也会很好。
更新:再次阅读manual它所说的一组字符,一切都失去了它的特殊含义,除了字符类(例如\w
)
在字符类列表中,行{}为\A
,但这不起作用[\AaAbB]([zZyY])
知道为什么吗?
答案 0 :(得分:26)
您无法匹配^
中的$
或[]
,因为字符类中唯一具有特殊含义的字符是^
(如“ “)和-
(如”范围“)(以及字符类)。 \A
和\Z
只是不算作字符类。
这适用于正则表达式的所有(标准)版本,因此您会遇到(^|[stuff])
和($|[stuff])
(实际上并非那么糟糕)。
答案 1 :(得分:2)
连接角色' a'到字符串的开头。然后使用[aAbB]([zZyY])
。
答案 2 :(得分:1)
试试这个:
(?<![^abAB])([yzYZ])
答案 3 :(得分:0)
为什么不尝试转义字符\
? ([\^\$]
)
更新: 如果你想找到所有Z和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