首页 > 解决方案 > Java 正则表达式未捕获组

问题描述

我正在将正则表达式应用于以下字符串:

2x#0$×4x#3$÷5x#0$

使用以下代码:

String monomialRegex = "(-?\\d+(\\.\\d*)?[x][#]-?\\d+(\\.\\d*)?[\\$])";
String string2 = "2x#0$×4x#3$÷5x#0$";//the × between $ and 4 is a times symbol
string2 = string2.replaceAll(monomialRegex+"([×])"+monomialRegex+"([÷])"+monomialRegex,"÷$1%$5@×$3");

我的结果是:÷2x#0$%4x#3$@×

根据我对团体的了解:

$1 = 2x#0$
$2 = ×
$3 = 4x#3$
$4 = ÷
$5 = 5x#0$

结果,我看到它没有使用组 $5 而是使用组 $3 并且组 $3 甚至没有出现?

关于如何处理这个正则表达式的任何建议?

标签: javaregex

解决方案


您的完整正则表达式是:

(-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])([×])(-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])([÷])(-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])

它的捕获组是:

  1. (-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])
  2. (\.\d*)
  3. (\.\d*)
  4. ([×])
  5. (-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])
  6. (\.\d*)
  7. (\.\d*)
  8. ([÷])
  9. (-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])
  10. (\.\d*)
  11. (\.\d*)

使用您当前的输入,以下组具有内容:

  • 1 : 2x#0$
  • 4:×
  • 5 : 4x#3$
  • 8:÷
  • 9 : 5x#0$

您可以在 regex101 上将其可视化:https ://regex101.com/r/Nh0xxW/1

我将使用以下方法来实现相同的目标(至少如果我猜对了):

Match (-?\d+(?:\.\d*)?x#-?\d+(?:\.\d*)?\$)×(-?\d+(?:\.\d*)?x#-?\d+(?:\.\d*)?\$)÷(-?\d+(?:\.\d*)?x#-?\d+(?:\.\d*)?\$)
Replace by %$1%$2@×$3

如此处所示:https ://regex101.com/r/Nh0xxW/2

我主要通过删除无用的组(不需要捕获作为整个单项式捕获组的一部分的小数,也不需要在替换中不使用的 ÷ 和 ×)和单字符字符类来简化正则表达式。

如果您愿意,您仍然可以通过串联一个更简单的正则表达式来制作正则表达式(尽管我发现它最终会使整个事情变得更复杂),并且以下代码将这样做:

String monomialRegex = "(-?\\d+(?:\\.\\d*)?x#-?\\d+(?:\\.\\d*)?\\$)";
String completeRegex = monomialRegex + "×" + monomialRegex + "÷" + monomialRegex;

我已经在 ideone 上测试了 java 代码:https ://ideone.com/Eg8Zz6


推荐阅读