java - 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 甚至没有出现?
关于如何处理这个正则表达式的任何建议?
解决方案
您的完整正则表达式是:
(-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])([×])(-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])([÷])(-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])
它的捕获组是:
(-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])
(\.\d*)
(\.\d*)
([×])
(-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])
(\.\d*)
(\.\d*)
([÷])
(-?\d+(\.\d*)?[x][#]-?\d+(\.\d*)?[\$])
(\.\d*)
(\.\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
推荐阅读
- angularjs - 使用 ng-repeat 选择中的预选选项
- android - 窗口管理器阻止浮动聊天头下方应用程序的键盘
- c++ - c ++ /地图中的元素通过退出函数神秘地消失
- python - NameError:未定义名称“openFile”
- sql - 将多行数据放入单行
- postgresql - postgres 的设置:更新现有数据库或创建新数据库
- django - 如何在 Django 会话中存储用户的所有信息
- c - 为什么 exec() 系列函数实际上返回一个值?
- android - 删除recyclerview android中的项目时失去辅助功能焦点
- flutter - 如何在颤动中将数据从表单传递到下一个屏幕?