java正则表达式中的混淆

时间:2015-05-21 06:23:55

标签: java regex

根据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(case-insensitive)之外,我还能做些什么呢?

2 个答案:

答案 0 :(得分:3)

[^java] - >它匹配任何charcater但不匹配jva[^..]称为否定字符类。它匹配除了被否定的charcater类中存在的字符匹配的字符之外的所有字符。

^java - >它匹配行开头的字符串java。您可以按m.group(0)打印匹配。

^(java) - >它捕获一行开头的字符串java。您可以按m.group(0)打印匹配,并在m.group(1)之前打印第一个捕获组内的字符,其中mMatcher类的对象。因此,您可以从javam.group(0)获取字符串m.group(1)

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

答案 1 :(得分:1)

在正则表达式中,[…]表示字符类。角色类有自己的迷你语言:适用不同的特殊字符集,它们有不同的含义。

最好的办法是将正则表达式中的^视为行首锚。 但是,在上下文[^abc]中,这是一个否定的字符类,即匹配除abc之外的任何单个字符。

差异的另一个例子是-。一般来说,它只是一个文字-字符。但是,在字符类中,它定义了一个范围。 (例如,[a-z]匹配所有ASCII小写字母。)