gpt4 book ai didi

Java Regex - 使用单个美元捕获字符串,但当它有两个连续的美元时则不会

转载 作者:行者123 更新时间:2023-12-02 09:13:51 26 4
gpt4 key购买 nike

我发布了this之前的问题。

但这还没有结束。那里适用的所有规则仍然适用。

所以字符串:

  • "%ABC%"结果会产生 ABC(捕获百分号之间的内容)
  • 就像 "$ABC." (捕获 $ 之后的内容,当出现另一个美元或点时放弃)
  • "$ABC$XYZ"也会,并给出 XYZ 作为结果。

要添加更多内容:

  • "${ABC}"也应该产生 ABC 。 (如果存在的话,请忽略大括号 - 也许不是捕获字符?)。
  • 如果您有两个连续的美元符号,例如 "$$EFG" ,或"$${EFG}" ,
    不应出现在正则表达式结果中。 (这就是编号或命名的反向引用发挥作用的地方 - 也是我将它们视为非捕获组的原因)。据我了解,具有以下语法的组成为非捕获组 (?:)

1) 我可以说 % 或 $ 是非捕获组并按数字引用吗?或者只有捕获组才能获得分配的编号?

2) 编号的顺序是什么,如果有 ((A) (B) (C)) 。外组是1,A 2,B 3 C 4吗?

我一直在查看命名组。看到提到的语法here

(?<name>capturing text) to define a named group "name"

\k<name> to backreference a named group "name"

3) 不确定是否可以在 Java 中命名非捕获组?有人能解释一下吗?

  • 更多信息 here on non capture groups .
  • 更多信息请参见 lookbehinds
  • 问题的类似答案 here ,但并没有完全得到我想要的东西。不确定 Java 中是否存在反向引用问题。
  • 类似问题here 。但无法理解适用于此的工作版本。

我使用了与我原来的问题中完全相同的 Java,除了:

String search = "/bla/$V_N.$$XYZ.bla";
String pattern = "(?:(?<oc>[%$]))(?!(\\k<oc>))([^%.$]*)+";

这应该只会产生V_N

我真的很苦恼这个问题,想知道是否有人可以帮助我解决这个问题。谢谢。

最佳答案

您可以使用多个捕获组编写更详细的正则表达式,并且只捕获那些不是 null 的正则表达式。 ,或者简单地连接找到的组值,因为每次匹配时总是只有其中一个被初始化:

%([^%.]+)%|(?<!\$)\$(?:\{([^{}]+)\}|([^$.]+))

请参阅regex demo .

详细信息

  • %([^%.]+)% -% ,第 1 组:除 % 之外的一个或多个字符和. ,然后是 %已消耗
  • | - 或
  • (?<!\$) - 负向后查找,匹配字符串中不紧接 $ 的位置
  • \$ - 一个$
  • (?: - 与以下任一者匹配的非捕获容器组的开始:
    • \{([^{}]+)\} -{ ,第 2 组:除 { 之外的任何一个或多个字符和} ,然后}已消耗
    • | - 或
    • ([^$.]+) - 第 3 组:除 $ 之外的 1 个或多个字符和.
  • ) - 非捕获容器组的末尾。

Java usage :

String regex = "%([^%.]+)%|(?<!\\$)\\$(?:\\{([^\\{}]+)\\}|([^$.\\s]+))";
String string = "%ABC%\n$ABC.\n$ABC$XYZ ${ABC}\n\n$$EFG $${EFG}.";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher m = pattern.matcher(string);
List<String> results = new ArrayList<>();
while (m.find()) {
results.add(Objects.toString(m.group(1),"") +
Objects.toString(m.group(2),"") +
Objects.toString(m.group(3),""));
}
System.out.println(results); // => [ABC, ABC, ABC, XYZ, ABC]

请注意,在常规 Java 字符串文字中,\应该被转义(即 \\ )以引入单个文字反斜杠,该反斜杠用作正则表达式转义的一部分。

关于Java Regex - 使用单个美元捕获字符串,但当它有两个连续的美元时则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58827094/

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