来自Wiki,
这是尝试过的代码;
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>
我的问题是,为什么第二种方式( | )的工作方式与第一种方式相同(使用?)?
答案 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
。