java - 正则表达式 - 匹配模式但返回子模式

标签 java regex

我想匹配一个模式(使用java编程),但我只需要它的一部分。

示例...来自以下文本:

0 - Amount: 3 - Class 29
1 - Amount: 2 - Class 21
2 - Amount: 11 - Class 1

我想匹配模式“Amount:\d* - Class\d*”,但仅返回数字对,以便输出类似于数组:

{
    {3, 29},
    {2, 21},
    {11, 1}
}

我可以使用 java 正则表达式中实现的东西来做到这一点吗?我认为搜索匹配的字符串是不必要的,正则表达式似乎已经为此类问题做好了准备。

而且......正则表达式(一般来说,不仅仅是java正则表达式)是否有一个工具,这样就不需要太多额外的编程来从匹配的字符串中提取信息?如果其他一些正则表达式实现比 Java 的更适合这项工作,我可以切换编程语言。

最佳答案

您只需在正则表达式中使用括号来使用捕获组:

Amount: (\d*) - Class (\d*)
        ^--^-- Here---^---^

Regular expression visualization

<强> Working demo

然后您必须使用 \1\2 从中获取内容。在java中你必须使用matcher.group(n)。例如,您可以有这样的代码:

String str = "0 - Amount: 3 - Class 29\n1 - Amount: 2 - Class 21\n2 - Amount: 11 - Class 1";

Pattern pattern = Pattern.compile("Amount: (\\d*) - Class (\\d*)");
Matcher matcher = pattern.matcher(str);

StringBuffer sb = new StringBuffer("{");
while (matcher.find()){
    sb.append(String.format("{%s, %s},", matcher.group(1), matcher.group(2)));
}
sb.setLength(sb.length()-1); // remove last comma
sb.append("}");

System.out.println(sb.toString())

<强> Full IdeOne code

关于java - 正则表达式 - 匹配模式但返回子模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38400274/

相关文章:

ios - 正则表达式在 XCode 中查找注释代码

java - 系统.输出.打印。如何对打印输出进行编号? ( java )

java - 没有RMI的两个JVM之间的通信?

java - Spring @Async 不工作

regex - 从 `^` 中删除 `s/^/1/;` 会导致我的代码失败。为什么?

java - 使用日历后验证文本框

java - DataInputStream read() 总是返回 -1

java - 文件引用,正确的语法是什么

regex - 如何替换 nginx 变量字符串中的字符?

python - 从 Python 代码字符串(正则表达式或 AST)中提取所有变量