我有一个搜索字符串。
当它包含美元符号时,我想捕获此后的所有字符,但不包括点或后续的美元符号。后者将构成后续匹配。
因此,对于这些搜索字符串中的任何一个......:
"/bla/$V_N.$XYZ.bla";
"/bla/$V_N.$XYZ;
我想返回:
如果搜索字符串包含百分比符号,我还想返回一对 % 符号之间的内容。
下面的正则表达式似乎可以解决这个问题。
"%([^%]*?)%";
推断:
- 以%开始和结束,
- 有一个捕获组 - ()
- 有一个包含除 % 符号之外的任何内容的字符类(脱字符号表示不是字符)
- 重复 - 但不是贪婪*?
在某些语言允许的情况下%1
, %2
,对于捕获组,Java 使用backslash\number
语法代替。因此,该字符串编译并生成输出。
我怀疑美元符号和点需要转义,因为它们是特殊符号:
我尝试过使用双反斜杠符号.. \
- 两者都是字符类,例如
[^\\.\\$%]
- 并使用OR'd符号
%|\\$
试图结合这种逻辑,但似乎无法发挥任何作用。
我不知道另一双眼睛是否能看到如何解决这个难题!
到目前为止我的尝试:
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Main {
public static void main(String[] args) {
String search = "/bla/$V_N.$XYZ.bla";
String pattern = "([%\\$])([^%\\.\\$]*?)\\1?";
/* Either % or $ in first capture group ([%\\$])
* Second capture group - anything except %, dot or dollar sign
* non greedy group ( *?)
* then a backreference to an optional first capture group \\1?
* Have to use two \, since you escape \ in a Java string.
*/
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(search);
List<String> results = new ArrayList<String>();
while (m.find())
{
for (int i = 0; i<= m.groupCount(); i++) {
results.add(m.group(i));
}
}
for (String result : results) {
System.out.println(result);
}
}
}
以下链接可能会有所帮助:
-
一个交互式 Java 游乐场,您可以在其中进行实验和复制/粘贴代码 https://repl.it/~.
- Regex101 https://regex101.com/
- Java 正则表达式测试器 https://www.freeformatter.com/java-regex-tester.htm
-
Java 反向引用 https://www.logicbig.com/tutorials/core-java-tutorial/java-regular-expressions/regex-backreferences.html(可选的反向引用
\\1
在正则表达式中)。
- 总结语言中常见的正则表达式特殊字符的链接 http://www.tads.org/t3doc/doc/sysman/regex.htm
- Java Regex 书籍 EPub 链接 https://epdf.pub/java-regular-expressions-taming-the-javautilregex-enginebb1d05a7e538794b13b753aba70948a355735.html
- 正则表达式信息网站 https://www.regular-expressions.info/charclass.html
- Javadocs 中的 Matcher 类 https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html
您可以使用
String search = "/bla/$V_N.$XYZ.bla";
String pattern = "[%$]([^%.$]*)";
Matcher matcher = Pattern.compile(pattern).matcher(search);
while (matcher.find()){
System.out.println(matcher.group(1));
} // => V_N, XYZ
See the Java演示 https://ideone.com/TGBOpY和正则表达式演示 https://regex101.com/r/Thvy2r/1.
NOTE
- 您不需要可选的
\1?
在模式的末尾。由于它是可选的,因此它不限制匹配上下文并且是多余的(因为否定的字符类既不能匹配也不能匹配)$
nor%
)
-
[%$]([^%.$]*)
火柴%
or $
,然后将任何零个或多个捕获到组 1 中
以外的字符%
, .
and $
。您只需要第 1 组值,因此,matcher.group(1)
用来。
- In a 字符类 https://www.regular-expressions.info/charclass.html, 两者都不
.
nor $
是特殊的,因此,它们不需要转义[%.$]
or [%$]
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)