Java正则表达式未捕获组

时间:2019-01-01 20:28:09

标签: java regex

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

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 AND $ 3组甚至没有出现?

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

2 个答案:

答案 0 :(得分:1)

您的完整正则表达式为:

<template>
    <div>
        <home-component slot-scope="{ posts }">
            <div class="card mb-4" v-for="post in posts">
               <div class="card-body">
                 <h2 class="card-title">{{ post.title }}</h2>
                 <p class="card-text">{{ post.body }}</p>
                 <a href="#" class="btn btn-primary">Read More &rarr;</a>
               </div>
               <div class="card-footer text-muted">
                 Posted on January 1, 2017 by
                 <a href="#">xxx</a>
               </div>
             </div> 
        </home-component>
    </div>
</template>
<script>
import HomeComponent from "@/components/HomeComponent.vue";
export default {
  name: "home",
  components: {
    HomeComponent
  },
};
</script>

其捕获组为:

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

在您当前输入的情况下,以下组具有内容:

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

您可以在regex101上看到它:https://regex101.com/r/Nh0xxW/1

我将使用以下内容来实现相同的目标(至少在我正确猜对的情况下):

(\.\d*)

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

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

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

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

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

答案 1 :(得分:0)

问题出在monomialRegex内部的子组中:

我摆脱了这个分组:(\。\ d *)?在monomialRegex中。

我用[\。]?[\ d +]替换了此子组?而且有效。 我不需要在整个正则表达式中更改组的顺序。