正则表达式" \\,"之间的区别是什么?和","?

时间:2015-02-03 15:30:58

标签: java regex escaping comma

以下代码示例尝试用逗号表示split字符串(即将\\,传递给String.split()

当我将分隔符更改为,时,它可以正常工作。 问题是使用,\\,之间的区别是什么?我什么时候应该使用每一个?

修改

此外,如果我放置','之外的字符,例如p,则该语句会抛出运行时异常,因为p不是要转义的特殊正则表达式字符,为什么呢接受逃脱逗号?!

示例:

String x = "a,b,c,d";
System.out.println(Arrays.toString(x.split("\\,")));

输出:

[a, b, c, d]

3 个答案:

答案 0 :(得分:5)

没有区别。 \\用于转义正则表达式中的特殊字符。角色,不是其中之一。

答案 1 :(得分:1)

根据\\,,拆分输入会返回相同的输出。由于,不是正则表达式中的特殊字符,因此您无需逃避它。

但是逃脱的角色有一些特殊的含义。例如,\\s匹配空格字符。 \\S匹配非空格字符。 \\d匹配一个数字。 \\D匹配非数字字符。所以不要逃避字母表。

转发某些特殊字符,例如,%#,不会产生任何问题。但逃避一些特殊字符的功能会有所不同。例如,\\$匹配文字$符号,但未转义$匹配该行的结尾。

最后,不要转义数字以匹配字面数字。例如,1\\1具有不同的含义。 1与文字1匹配,其中\\1指的是第一个捕获的组。

答案 2 :(得分:0)

您没有说“\\,”是否正常工作或似乎与“,”一样,正如分割正则表达式。我怀疑它是基于我认为我对javac以及正则表达式的了解。

当你写“\\,”时,.class文件中出现的字符串是“\,”。这是由于javac如何处理字符串文字。

当正则表达式编译器看到“\”时,它有效地将该字符串视为“,”,原因与javac类似。当然,在正则表达式中使用'\'有很好的理由。例如,如果'['字符出现在您正在扫描的输入中,并且您希望您的解析器在查找'['后跟数字时变得僵硬,那么您必须编写字符串文字,如“\\ [[0-9 ] [0-9] *“或更简洁”\\ [\ d +“。这是因为正则表达式编译器将'['视为特殊的,就像前者演示的那样。

编辑:“\”之所以如此。当你阅读正则表达式结构的摘要部分http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum时,表示所有字符类都有跟在'\'后面的字母,这意味着实现者可能会考虑“ \ p“错误而不仅仅是”p“。如果没有其他原因,我会鼓励您不要在初始问题上添加其他问题,而不是让那些试图回答您的第一个问题并且没有注意到您提出后续问题的人更加困惑。相反,你应该发布一个单独的问题,特别是当它暴露特殊情况时,例如你的后续问题。

在我看来,作者采取了正确的路径,这应该鼓励他们的用户完全理解他们撰写的每个正则表达式。