当前位置: 首页 > 面试题库 >

Java中的正则表达式反向引用

郁光熙
2023-03-14
问题内容

我必须先匹配一个数字,然后再匹配14次。然后,我来到了regexstor.net/tester中的以下正则表达式:

(\d)\1{14}

编辑

当我将其粘贴到代码中时,包括正确的反斜杠:

"(\\d)\\1{14}"

我已经用来替换了反向引用"\1",该反向引用"$1"用于替换Java中的匹配项。

然后我意识到这是行不通的。在Java中,当需要在REGEX中向后引用匹配项时,必须使用"\N",但是要替换它时,运算符为"$N"

我的问题是:为什么?


问题答案:

$1在Java的正则表达式中不是反向引用,也不是我能想到的任何其他形式。您仅$1替换 某些东西时使用:

String input="A12.3 bla bla my input";
input = StringUtils.replacePattern(
            input, "^([A-Z]\\d{2}\\.\\d).*$", "$1");
//                                            ^^^^

关于反向引用是什么存在一些误导信息,包括我从中获得该摘录的位置:带有反向引用的简单Javaregex不起作用。

Java在其他$已经成为元字符的现有风格之后,对其正则表达式语法进行了建模。它锚定到字符串的末尾(或在多行模式下为行)。

同样,Java使用\1反向引用。由于正则表达式是字符串,因此必须转义:\\1

从词汇/句法的角度来看,确实$1可以明确地使用它(作为一项奖励,使用反向引用时,它可以防止“邪恶逃脱”的需要)。

为了匹配1行尾之后的,正则表达式必须为$\n1

this line
1

使用熟悉的语法而不是更改规则(大多数来自Perl)更有意义。

Perl的第一个版本于1987年问世,比Java早得多,后者于1995年以beta版本发布。

我挖了Perl 1的手册页,其中说:

(\ ...\ )也可以使用包围结构,在这种情况下,\<digit>匹配第digit‘个子字符串。(在模式之外,请始终使用$而不是\在数字前使用。$<digit>(和$\``,$&$’)的范围扩展到封闭的BLOCK或eval字符串的末尾,或扩展到与子表达式匹配的下一个模式。该\ 符号有时在外部起作用当前的模式,但不应该依赖。)您可以根据需要添加任意多个括号。如果你有超过9子,变量$10 $11 ......请参阅相应的字符串。在模式中\10 \11 ,等等。如果在反向引用之前至少有很多左括号,请返回子字符串。否则(出于向后兼容性考虑)\10 \010 ,退格键和制表符\11 相同\011 。等等。(\1 通过\9`总是反向引用。)



 类似资料:
  • 本文向大家介绍Java正则表达式中的反向引用,包括了Java正则表达式中的反向引用的使用技巧和注意事项,需要的朋友参考一下 捕获组是一种将多个字符视为一个单元的方法。通过将要分组的字符放在一组括号内来创建它们。例如,正则表达式(狗)创建一个包含字母“ d”,“ o”和“ g”的单个组。 捕获组通过从左到右计数其开括号来编号。例如,在表达式((A)(B(C)))中,有四个这样的组- 示例 反向引用允

  • 本文向大家介绍正则表达式捕获Java中的组和反向引用,包括了正则表达式捕获Java中的组和反向引用的使用技巧和注意事项,需要的朋友参考一下 捕获组是一种将多个字符视为一个单元的方法。通过将要分组的字符放在一组括号内来创建它们。例如,正则表达式(狗)创建一个包含字母“ d”,“ o”和“ g”的单个组。 捕获组通过从左到右计数其开括号来编号。例如,在表达式((A)(B(C)))中,有四个这样的组-

  • 问题内容: 我很难用正则表达式的后向引用替换字符串:什么也不会替换,而且我总是以我的输入结尾。 我的代码: 主要问题是我不能更改Java代码,而只能更改输入,正则表达式和组引用。 您对符合我需求的任何其他正则表达式模式有什么建议吗? 来自 问题答案: 您将自己替换相同的匹配模式。可能您的意思是: 将匹配输入直到结束。

  • 问题内容: 我想使用Java正则表达式否定一组单词。 再说了,我想否定,,,。我写了一个正则表达式。 有些似乎不起作用。 问题答案: 试试这个: 如果不包含svn,cvs,nvs或mvc之一,则它将与文本匹配。 这是一个类似的问题:C#正则表达式要匹配不包含某个字符串的字符串?

  • 问题内容: 如何编写一个正则表达式来匹配它(反斜杠然后是引号)?假设我有一个像这样的字符串: 我需要将所有替换为,因此结果如下所示: 这是行不通的:因为它只匹配引号。不确定如何使用反斜杠。我本可以先删除反斜杠,但字符串中还有其他反斜杠。 问题答案: 如果你 不需要任何像预定义的字符类\ d,量词等正则表达式的机制 ,而不是其预期正则表达式使用其预计文字 两种方法都将替换 所有 出现的目标,但是将按

  • 问题内容: 我正在尝试输入之间的内容,我的模式没有做正确的事,请帮忙。 下面是sudocode: 要求的输出: 之一 二 三 问题答案: 先行使用并在循环中使用,而不是: 看到它在线上工作:ideone 但是最好在这里使用split: 看到它在线上工作:ideone