使用“\\\\”来匹配'\'与Java中的Regex最可读的方式?

时间:2010-03-23 22:28:26

标签: java regex readability

我知道以下有效,但它不具有可读性,是否有任何方法可以使代码本身更具可读性而无需添加注释?

//Start her off
String sampleregex = "\\\\";
if (input.matches(sampleregex))
   //do something
//do some more

6 个答案:

答案 0 :(得分:6)

为什么不

if (input.contains("\\")) {
}

因为您似乎只是在寻找反斜杠?

答案 1 :(得分:4)

假设您的意思是"\\\\"而不是"////"

您可以使用\Q\E来移除它,这会删除一层反斜杠:"\\Q\\\E",但这并没有那么好。您还可以使用Pattern.quote("\\")在运行时将其转义。但就个人而言,我只会坚持使用"\\\\"

(顺便说一下,你需要其中四个,因为\用于在正则表达式引擎和Java字符串中转义,所以你需要转义一次所以正则表达式引擎知道你没有尝试scape任何其他东西(所以\\);然后你需要逃避这两个,所以Java知道你没有逃避字符串中的某些东西(所以\\\\))。

答案 2 :(得分:2)

/不是正则表达式元字符,因此正则表达式字符串"/"匹配单个斜杠,而"////"连续匹配四个。

我想你想问一下匹配单个反斜杠而不是正斜杠,在这种情况下,不需要,你需要将"\\\\"放在正则表达式字符串文字中以匹配单个反斜杠。 (我需要输入八个才能让四个出现在SO上 - 该死的!)

答案 3 :(得分:2)

我的解决方案与Soldier.moth类似,但有一点扭曲。创建一个包含常用正则表达式的常量文件,并继续添加它。作为常量的表达式甚至可以组合在一起,为构建正则表达式提供一个抽象层,但最终它们仍然常常变得混乱。

public static final String SINGLE_BACKSLASH = "\\\\";

答案 4 :(得分:1)

我想到的一个解决方案就是

String singleSlash = "\\\\";
if(input.matches(singleSlash))
   //...

答案 5 :(得分:0)

为变量和常量使用更好的名称,并逐步编写它们是一种无需注释的好方法,例如:

final string backslash = "\\";
final string regexEscapedBackslash = backslash + backslash;

if (input.matches(regexEscapedBackslash)) {
    ...