gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:16:49 25 4
gpt4 key购买 nike

我必须将一个数字及其本身匹配 14 次。然后我在 regexstor.net/tester 中找到了以下正则表达式:

(\d)\1{14}

编辑

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

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

我已将反向引用 "\1" 替换为 "$1",后者用于替换 Java 中的匹配项。

然后我意识到这不起作用。当你需要在 REGEX 中反向引用匹配项时,在 Java 中,你必须使用 "\N",但是当你想要替换它时,操作符是 "$N".

我的问题是:为什么?

最佳答案

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

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

关于什么是反向引用有一些错误信息,包括我从以下位置获得该片段的地方:simple java regex with backreference does not work .

<小时/>

Java 按照其他现有风格建模其正则表达式语法,其中 $已经是元字符了。它锚定到字符串的末尾(或多行模式下的行)。

同样,Java 使用 \1供后面引用。因为正则表达式是字符串,所以必须对其进行转义:\\1 .

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

匹配 1在行尾之后,正则表达式需要是 $\n1 :

this line
1

使用熟悉的语法而不是更改规则更有意义,其中大部分规则来自 Perl。

Perl 的第一个版本发布于 1987 ,它比Java早得多,Java于1995发布了测试版。

我挖出了man pages for Perl 1 ,其中说:

The bracketing construct (\ ...\ ) may also be used, in which case \<digit> matches the digit'th substring. (Outside of the pattern, always use $ instead of \ in front of the digit. The scope of $<digit> (and $\`, $& and $') extends to the end of the enclosing BLOCK or eval string, or to the next pattern match with subexpressions. The \<digit> notation sometimes works outside the current pattern, but should not be relied upon.) You may have as many parentheses as you wish. If you have more than 9 substrings, the variables $10, $11, ... refer to the corresponding substring. Within the pattern, \10, \11, etc. refer back to substrings if there have been at least that many left parens before the backreference. Otherwise (for backward compatibilty) \10 is the same as \010, a backspace, and \11 the same as \011, a tab. And so on. (\1 through \9 are always backreferences.)

关于java - Java 中的正则表达式反向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37734164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com