Ish*_*are 2 regex escaping kotlin
我正在使用正则表达式尝试一些字符串操作,但我没有得到预期的输出
var myString = "/api/<user_id:int>/"
myString.replace(Regex("<user_id:int>"), "(\\d+)")
Run Code Online (Sandbox Code Playgroud)
这应该给我一些类似/api/(\d+)/但我得到的东西/api/(d+)/
但是,如果我直接创建一个转义字符串,就像var a = "\d+"
我得到正确的输出\d+(我可以进一步用来创建一个正则表达式模式)
这是因为这种方式String::replace有效吗?
如果是这样,这不是一个错误,为什么它会删除我的转义序列?
要替换文字字符串,请使用:
myString.replace(Regex("<user_id:int>"), Regex.escapeReplacement("(\\d+)"))
Run Code Online (Sandbox Code Playgroud)
有关详细信息,这就是kotlin Regex.replace正在做的事情:
Pattern nativePattern = Pattern.compile("<user_id:int>");
String m = nativePattern.matcher("/api/<user_id:int>/").replaceAll("(\\d+)");
-> m = (d+)
Run Code Online (Sandbox Code Playgroud)
来自Matcher.replaceAll() javadoc:
请注意,替换字符串中的反斜杠()和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同.如上所述,美元符号可被视为对捕获的子序列的引用,反斜杠用于替换替换字符串中的文字字符.
以上Regex.escapeReplacement呼叫正是这么做的,把(\\d+)到(\\\\d+)