我已经发布this https://stackoverflow.com/questions/58821727/java-regex-java-util-regex-search-for-dollar-sign早点问。
但这还没有结束。
那里适用的所有规则仍然适用。
所以字符串:
-
"%ABC%"
结果会产生 ABC (捕获百分号之间的内容)
- 一样
"$ABC."
(捕获 $ 之后的内容,当出现另一个美元或点时放弃)
-
"$ABC$XYZ"
也会,并且也会给出 XYZ 作为结果。
对此添加更多内容:
-
"${ABC}"
也应该产生 ABC 。 (如果存在的话,请忽略大括号 - 也许不是捕获字符?)。
- 如果您有两个连续的美元符号,例如
"$$EFG"
, or "$${EFG}"
,
那应该not出现在正则表达式结果中。 (这就是编号或命名的反向引用发挥作用的地方 - 也是我将它们视为非捕获组的原因)。据我了解,使用此语法,一个组将成为一个非捕获组(?:)
.
1)我可以说 % 或 $ 是非捕获组并按数字引用吗?或者只有捕获组才能获得分配的编号?
2)编号的顺序是什么(如果有)((A) (B) (C))
。外群是1、A 2、B 3 C 4 吗?
我一直在查看命名组。看到提到的语法here https://stackoverflow.com/a/415635/495157
(?<name>capturing text)
定义一个命名组“name”
\k<name>
反向引用命名组“名称”
3)不确定是否可以在Java中命名非捕获组?有人可以解释一下吗?
- 更多信息这里关于非捕获组 https://www.javamex.com/tutorials/regular_expressions/non_capturing_groups.shtml.
- 更多信息请参见此处回顾 https://www.logicbig.com/tutorials/core-java-tutorial/java-regular-expressions/regex-lookbehind.html
- 类似问题的答案here https://stackoverflow.com/a/16717823/495157,但并没有完全得到我想要的东西。不确定 Java 中是否存在反向引用问题。
- 类似问题here https://stackoverflow.com/questions/2734977/backreferences-in-lookbehind。但我无法理解适用于此的工作版本。
我使用了与我原来的问题中完全相同的 Java,除了:
String search = "/bla/$V_N.$$XYZ.bla";
String pattern = "(?:(?<oc>[%$]))(?!(\\k<oc>))([^%.$]*)+";
这应该只会导致V_N.
我真的很苦恼这个问题,想知道是否有人可以帮助我解决这个问题。谢谢。
您可以编写一些带有多个捕获组的更详细的正则表达式,并且只捕获那些不是的null
,或者简单地连接找到的组值,因为每次匹配时总是只有其中一个被初始化:
%([^%.]+)%|(?<!\$)\$(?:\{([^{}]+)\}|([^$.]+))
See the 正则表达式演示 https://regex101.com/r/7Q6EAD/1.
Details
-
%([^%.]+)%
- %
,第 1 组:除%
and .
,那么一个%
被消耗
-
|
- or
-
(?<!\$)
- 负向后查找,匹配字符串中不紧接前面的位置$
-
\$
- a $
-
(?:
- start of the non-capturing container group matching either of:
-
\{([^{}]+)\}
- {
,第 2 组:除{
and }
, then }
被消耗
-
|
- or
-
([^$.]+)
- 第 3 组:1 个或多个字符,除$
and .
-
)
- 非捕获容器组的末尾。
Java的使用 https://ideone.com/kaKfBz:
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 字符串文字中,\
应该转义(即\\
)来介绍一个literal用作一部分的反斜杠正则表达式转义.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)