我正在维护一些代码,我看到像someString.matches("\\$\\{.*}")
这样的正则表达式。我知道java中的反斜杠正在逃避反斜杠。 $表示行尾,{}表达式表示预期的字符串。
所以我相信(虽然现在我知道我错了)这个正则表达式是过滤字符串末尾有点的字符串并且采用这种格式:It seems to be.a.beautiful.day
但我错了。有人可以指点我理解这个正则表达式可以解析什么?
答案 0 :(得分:4)
反斜杠字符(\
)正在转义美元符号($
)和大括号({
),因此它们不会被视为特殊字符,因此此正则表达式将匹配一个字面的美元符号后面紧跟一个花括号,后跟任意数字的任何字符,后跟一个结束的大括号(}
)。
这将匹配的一些例子:
答案 1 :(得分:2)
Java编译器接受此字符串"\\$\\{.*}"
并用单斜杠替换双斜杠,因此regexp引擎会看到:
\$\{.*}
这意味着一个字符串以美元符号$
开头,后跟花括号中的零个或多个字符序列。
编写类似表达式的更好方法如下:
\$\{[^}]*}
(您需要转义Java编译器的反斜杠)。在看到第一个结束大括号后,此表达式将停止,并避免braktracking。
答案 2 :(得分:1)
"\\$\\{.*}"
对字符串进行编码
\$\{.*}
因为Java编译器在到达正则表达式库之前会解释\\
。
当用作正则表达式时,它会匹配文字${
,后跟任意数量的非换行符,直到最后一个文字}
。