Java正则表达式中的混淆问题

3
根据java.util.regex.Pattern文档,^表示否定,也表示行的开头。如何确定在任何程序中^被用于什么?这是Thinking in Java的一个程序(与上面的问题无关)。
import java.util.regex.*;
public class ReFlags {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("[^java]", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
        Matcher m = p.matcher(
        "java has regex\nJava has regex\n" +
        "JAVA has pretty good regular expressions\n" +
        "Regular expressions are in Java");
        while(m.find())
            System.out.print(m.group());
    }
}

输出结果

 hs regex
 hs regex
 hs pretty good regulr expressions
Regulr expressions re in

模式 ^[java] 的输出结果是 jJJ

模式 (^java)^(java)^java 的输出结果均为 javaJavaJAVA

我理解了[^java]的含义,但其他四个模式的含义是什么呢? 如果想要在输出中排除单词“java”(不区分大小写),应该怎么做呢?


[^java] 是负字符类,意味着匹配除了该类中列出的 j,a,v 以外的任何内容。 - anubhava
所以,输出结果与预期相符。在第一种情况下,它是字符类中的否定,而在第二种情况下,它是行首符号。 - Wiktor Stribiżew
2个回答

3

[^java] -> 它匹配除了字母 jva 以外的任何字符。 [^..] 被称为否定字符类,它匹配除了被否定字符类中的字符之外的所有字符。

^java -> 它匹配一行开头的字符串 java。你可以通过 m.group(0) 打印匹配结果。

^(java) -> 它捕获一行开头的字符串 java。你可以通过 m.group(0) 打印匹配结果,并通过 m.group(1) 获取第一个捕获组内的字符,其中 mMatcher 类的对象。因此,你可以从 m.group(0)m.group(1) 中都获取到字符串 java

(^java) -> 与上述相同,它捕获一行开头的字符串 java


匹配和捕获之间有区别吗?例如,^java 和 ^(java) 之间有区别吗? - Jeet Parekh
1
@vicky96:相关阅读:https://dev59.com/KGQn5IYBdhLWcg3w36M1。捕获组允许您提取与表达式某部分匹配的文本。在“^java”和“^(java)”的情况下,捕获组并没有显示其有用性,因为捕获组捕获的文本与整个表达式完全相同。 - nhahtdh

1
在正则表达式中,[…] 表示一个 字符类。字符类有自己的小语言:应用不同的特殊字符,并且它们有不同的含义。
你最好把正则表达式中的 ^ 理解为行首锚点。然而,在上下文 [^abc] 中,它表示一个否定字符类,即匹配除了 abc 之外的任意单个字符。
另一个例子是 -。通常,它只是一个字面的 - 字符。但是,在字符类内部,它定义了一个范围。(例如,[a-z] 匹配所有的 ASCII 小写字母。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接