正则表达式:匹配字符组或行尾

时间:2012-02-06 04:30:02

标签: python regex

如何在^(字符组)中匹配$(行首)和[](行尾)?


简单的例子

haystack string:zazty

规则:

  1. 匹配任何“z”或“y”
  2. 如果之前是
    1. a“a”,“b”;或
    2. 在行的开头。
  3. 通: 匹配前两个“z”

    可行的正则表达式是:
    (?:^|[aAbB])([zZyY])

    但是我一直认为用类似意味着字符组内的开头/结尾的东西会更清晰 [^aAbB]([zZyY])
     (在该示例中假设^表示行的开头,而不是它的真实位置,对于字符组是负的)


    注意:使用python。但是知道在bash和vim上也会很好。

    更新:再次阅读manual它所说的一组字符,一切都失去了它的特殊含义,除了字符类(例如\w

    在字符类列表中,行{}为\A,但这不起作用[\AaAbB]([zZyY])

    知道为什么吗?

4 个答案:

答案 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