区别?或者在正则表达式中

时间:2014-12-23 10:22:05

标签: java regex

来自Wiki

  • =>匹配前面的元素零次或一次。例如,ab?c仅匹配" ac"或" abc"。
  • | =>选择(也称为交替或集合并)运算符匹配运算符之前的表达式或运算符之后的表达式。例如,abc | def匹配" abc"或" def"。

这是尝试过的代码;

String yuStr =  "-7.00, 10.00, 0.00, -212.000";

//Using ?
System.out.println(yuStr.replaceAll("-?(\\d+)\\.\\d+", "$1"));

//Using |
System.out.println(yuStr.replaceAll("-|(\\d+)\\.\\d+", "$1"));

但是,两种方式都会产生相同的输出

7, 10, 0, 212

根据上面的Wiki文档,我的假设是正确的,第二种方式是,它是在运算符-之前的表达式和运算符(\\d+)之后的表达式之间进行选择吗? / p>

我的问题是,为什么第二种方式( | )的工作方式与第一种方式相同(使用)?

4 个答案:

答案 0 :(得分:2)

第一个表达式

十进制数字,可能前面有-

第二个表达式

A -或十进制数

当使用表达式作为replaceAll的参数时,由于您将$1设置为替换值,因此您将(顺便)获得相同的结果。

答案 1 :(得分:2)

这两个表达式具有不同的语义,即使它们碰巧为此特定输入生成相同的结果

在其他一些输入上,他们的结果会有所不同。例如,考虑1-2。第一个将返回1-2,而第二个将返回12

答案 2 :(得分:2)

出于不同原因使用

?|。例如:

public static void main(String[] args) {
    String yuStr = "--7";
    System.out.println("1 : " +yuStr.replaceAll("-?\\d","")); // replaces the second - and 7
    System.out.println("2 : " +yuStr.replaceAll("-|\\d","")); // replaces all - and all numbers
}

宣传OP:

1 : -  // first - is not replaced.
2 :    // empty string

在你的情况下,它只是一个共同发生,它们产生相同的输出。 注意:在正则表达式中,使用10种不同的方式(表达式)来获得相同的输出并不奇怪:)

答案 3 :(得分:1)

它们不一样,它们碰巧为你的例子产生了相同的输出。

第一个正则表达式中的4个匹配:

-7.00, 10.00, 0.00, -212.000
-1---  |   |  |  |  |      |
       11---  |  |  |      |
              1---  |      |
                    -111----

在每次比赛中,捕获组捕获十进制数的整个部分,并且所有四个匹配将被捕获组的内容替换。

第二个正则表达式中的6场比赛:

-7.00, 10.00, 0.00, -212.000
-|  |  |   |  |  |  ||     |
 1---  |   |  |  |  ||     |
       11---  |  |  ||     |
              1---  ||     |
                    -|     |
                     111----

捕获组仅捕获4场比赛中的一些文字。在其他2个匹配中,捕获组不会捕获任何内容。

在Oracle / OpenJDK中,引用一个在替换字符串中不捕获任何内容的组将导致空字符串。因此,只需删除-,对于此特定输入,最终结果是相同的。

但是,对于--7.3等输入,结果会有所不同。

在Android和GNU Classpath的实现a group that captures nothing is rendered as null when referred to in the replacement string中,所以第二种情况下的输出字符串将包含null