这个简单的正则表达式程序
import java.util.regex.*;
class Regex {
public static void main(String [] args) {
System.out.println(args[0]); // #1
Pattern p = Pattern.compile(args[0]); // #2
Matcher m = p.matcher(args[1]);
boolean b = false;
while(b = m.find()) {
System.out.println(m.start()+" "+m.group());
}
}
}
由java regex "\d" "sfdd1"
调用的编译并运行正常。
但如果#1被Pattern p = Pattern.compile("\d");
替换,则会出现编译错误,说明非法转义字符。在#1中,我也尝试打印命令行参数中指定的模式。它会打印\d
,这意味着它会被#2中的\d
取代。
那么为什么不抛出任何异常呢?最后它是Pattern.compile()
正在采用的字符串参数,它不会检测到非法转义字符吗?有人可以解释一下这种行为的原因吗?
答案 0 :(得分:3)
字符串文字中的反斜杠字符需要进行转义(以反斜杠开头)。从命令行传入时,字符串不是字符串文字。编译器抱怨,因为"\d"
不是有效的转义序列(请参阅 Escape Sequences for Character and String Literals )。
答案 1 :(得分:1)
\
字符用作Java字符串文字和正则表达式的转义字符。这让许多程序员感到困惑。如果要在Java中创建String以表示具有转义字符的正则表达式,则需要转义Java转义字符。
在命令行中传入字符串时,JVM会为您处理此问题,并只创建字符串。
你想要的是这个
Pattern p = Pattern.compile("\\d");
答案 2 :(得分:1)
Java中的反斜杠\
导致字符串中的转义。例如,字符串"\t"
会在java中生成制表符。这也是"\n"
生成换行符的原因。
在正则表达式中,\d
是与正则表达式相关的转义,不是 Java 。这意味着为了在字符串文字中获取\d
,您必须在字符串中键入"\\d"
。基本上,您必须转义\
以获取字面值\d
,然后当Pattern
编译正则表达式时,它进一步转义\d
以解析为数字
这可能令人困惑,但长话短说,你不应该在正则表达式的字符串文字中只有一个\
,因为即使字符串文字"\\n"
也能正确解析。
答案 3 :(得分:0)
我不完全确定我是否理解了这个问题,但似乎你的问题是你将“\ d”视为Java转义字符,它不存在。要将其视为正则表达式转义字符,请使用“\ d”来转义Java转义。