java - Java正则表达式中\\1*运算符的含义

标签 java regex

<分区>

我正在学习 Java 正则表达式,我注意到以下运算符:

\\*1

我很难理解它的含义(在网络上搜索没有帮助)。 例如,这两个选项有什么区别:

    Pattern p1 = Pattern.compile("(a)\\1*"); // option1
    Pattern p2 = Pattern.compile("(a)"); // option2

    Matcher m1 = p1.matcher("a");
    Matcher m2 = p2.matcher("a");

    System.out.println(m1.group(0));
    System.out.println(m2.group(0));

结果:

a
a

谢谢!

最佳答案

\\1 是在这种情况下对应于第一个捕获组的反向引用,这里是 (a)

所以在这种特殊情况下,(a)\\1* 等同于 (a)a*

这是一个显示差异的示例:

Pattern p1 = Pattern.compile("(a)\\1*");
Pattern p2 = Pattern.compile("(a)");

Matcher m1 = p1.matcher("aa");
Matcher m2 = p2.matcher("aa");

m1.find();
System.out.println(m1.group());
m2.find();
System.out.println(m2.group());

输出:

aa
a

如您所见,当您有多个 a 时,第一个正则表达式捕获所有连续的 a 而第二个正则表达式仅捕获第一个。

关于java - Java正则表达式中\\1*运算符的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38705002/

相关文章:

php - 如何在php中用preg_match_all分割这个字符串?

regex - 使用awk获取子字符串

Java http-读取大文件

java - Spark没有注册输出操作,所以没有什么可执行的,但我正在写入文件

java - 如何在Spring初始化的一开始就初始化Spring bean?

用于提取价格信息的 Java Regex

java - JADclipse 可以在 MacOS 上运行吗?

Java正则表达式用于具有两个子字符串且其间不包含特定子字符串的模式

ruby - 如何扫描文本中的多个字符串?

正则表达式 - 将文件重命名为文件名中的最高分辨率