正则表达式从开始删除哈希

时间:2016-04-07 12:22:19

标签: javascript regex

我正在遇到一个奇怪的问题。我跑的时候:

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("^#\/","")

有人可以解释为什么没有删除散列并且可能建议一个替代方案,只有当它出现在字符串的开头时才会删除散列吗?

3 个答案:

答案 0 :(得分:1)

replace的第一个参数可以是字符串或正则表达式。

您正在传递一个字符串,因此它正在寻找该字符串的完全匹配。

改为传递正则表达式。

"#/a/b/c/d".replace(/^#\//,"")

答案 1 :(得分:0)

String.replace将第一个参数作为字符串或正则表达式。如果你给它一个字符串,它是解释为或转换为正则表达式;从字面上看待它。因此,当您向字符串添加^时,它不会替换任何内容,因为输入中没有^

如评论中所述,您可以传递正则表达式文字(/.../)作为第一个参数,或者您可以使用new RegExp构建正则表达式(但为什么要这样做?)。

答案 2 :(得分:0)

当您将字符串作为第一个参数传递给.replace()方法时,该字符串将用作文字,并且只能进行1次替换。

请参阅MDN replace reference

  

substr (pattern)
  要由newSubStr替换的字符串。 将其视为逐字字符串,不会被解释为正则表达式。

您需要将正则表达式对象作为第一个参数传递:

"#/a/b/c/d".replace(/^#\//,"")
                    ^^^^^^

使用构造函数表示法(RegExp("^#/")没有意义,因为模式不是从变量动态构建的。

模式中没有双斜杠!外部/.../称为正则表达式分隔符。然后,insde是模式。模式为^#/,但由于/用作正则表达式分隔符,因此必须对模式中的/进行转义以匹配文字/(仅在正则表达式文字中)符号)。