我正在遇到一个奇怪的问题。我跑的时候:
dependencies {
compile 'com.gluonhq:charm-down-common:2.0.0';
desktopRuntime 'com.gluonhq:charm-down-desktop:2.0.0';
androidRuntime 'com.gluonhq:charm-down-android:2.0.0';
iosRuntime 'com.gluonhq:charm-down-ios:2.0.0';
}
我得到了我期望的结果:"#/a/b/c/d".replace("#\/","")
。
但是当我在这个正则表达式前面加上字符串字符a/b/c/d
的开头时,要得到:
^
这将返回原始字符串"#/a/b/c/d".replace("^#\/","")
。
有人可以解释为什么没有删除散列并且可能建议一个替代方案,只有当它出现在字符串的开头时才会删除散列吗?
答案 0 :(得分:1)
replace
的第一个参数可以是字符串或正则表达式。
您正在传递一个字符串,因此它正在寻找该字符串的完全匹配。
改为传递正则表达式。
"#/a/b/c/d".replace(/^#\//,"")
答案 1 :(得分:0)
String.replace
将第一个参数作为字符串或正则表达式。如果你给它一个字符串,它是不解释为或转换为正则表达式;从字面上看待它。因此,当您向字符串添加^
时,它不会替换任何内容,因为输入中没有^
。
如评论中所述,您可以传递正则表达式文字(/.../
)作为第一个参数,或者您可以使用new RegExp
构建正则表达式(但为什么要这样做?)。
答案 2 :(得分:0)
当您将字符串作为第一个参数传递给.replace()
方法时,该字符串将用作文字,并且只能进行1次替换。
substr (pattern)
要由newSubStr
替换的字符串。 将其视为逐字字符串,不会被解释为正则表达式。
您需要将正则表达式对象作为第一个参数传递:
"#/a/b/c/d".replace(/^#\//,"")
^^^^^^
使用构造函数表示法(RegExp("^#/")
没有意义,因为模式不是从变量动态构建的。
模式中没有双斜杠!外部/.../
称为正则表达式分隔符。然后,insde是模式。模式为^#/
,但由于/
用作正则表达式分隔符,因此必须对模式中的/
进行转义以匹配文字/
(仅在正则表达式文字中)符号)。