【问题标题】:Backslashes - Regular Expression - Javascript反斜杠 - 正则表达式 - Javascript
【发布时间】:2012-06-01 22:53:44
【问题描述】:

我想构建一个 JS 函数,将参数列表连接到有效路径(因为我无法确定路径的一部分是否带有斜杠)

这是函数:

concatPath = function() {
    var path = "";
    for(var i = 0; i < arguments.length; i++)   {
        path += arguments[i].replace("(\\|/)$|^(\\|/)", "") + "/";
    }
    return path;
}

使用的正则表达式匹配http://regexpal.com 上的所有开始和结束斜杠和反斜杠 但该功能无法正常工作(RegEx 不匹配)。 此外,Chrome 状态

SyntaxError:无效的正则表达式:/()$|^()/:未终止的组

当我只使用 RegEx 时

 (\\)$|^(\\)

但是,使用 RegEx

 (\\)$|^(\\)

工作正常。

是太晚了还是我错过了什么特别的东西?

提前致谢!

狮子座

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    在对replace 的调用中,您应该使用正则表达式文字(/.../)而不是字符串文字('...'"...")。字符串有自己的反斜杠解释,在正则表达式构造函数被破解之前就开始了,所以你需要额外的引用。

    匹配一个反斜杠,正则表达式文字:/\\/

    匹配一个反斜杠,字符串中的正则表达式:'\\\\'

    但是在正则表达式中,你还必须在正斜杠前面加上反斜杠,因为正斜杠是整个事物的分隔符:

    path += arguments[i].replace(/(\\|\/)$|^(\\|\/)/, "") + "/";
    

    或者,如果您出于某种原因喜欢使用字符串,这也应该有效:

    path += arguments[i].replace("(\\\\|/)$|^(\\\\|/)", "") + "/";
    

    附带说明,当您的替代品是单个字符时,(x|y) 过于矫枉过正;你可以只使用一个字符类([xy])。在这种情况下,您会得到:

    path += arguments[i].replace(/[\\\/]$|^[\\\/]/, "") + "/";
    
    path += arguments[i].replace("[\\\\/]$|^[\\\\/]", "") + "/";
    

    【讨论】:

    • 非常感谢,你能告诉我为什么我必须使用'\\\\'吗?我认为“\\”就足够了,因为我需要一个反斜杠来防止它转义“
    • 注意在 StackOverflow cmets 中也需要反斜杠... :) 当您使用字符串形式时,您将通过两个解析器 - Javascript 解析器,它正在构建字符串源代码和正则表达式解析器,它正在从字符串中构建正则表达式。正则表达式必须有两个反斜杠,但为了从文字中获取字符串中的单个反斜杠,您必须将其加倍。总之,这意味着四个反斜杠。试试这个:alert("--&gt; \\\\ &lt;--") - 当您将字符串传递给 replace 时,您看到的就是 Regexp.new 看到的。
    • 不客气!您应该接受一个答案(我的或 agent-j 的),以便人们将来更有可能回答您的问题。
    • 使用字符串可以将变量放入其中。#usecase
    【解决方案2】:

    试试这个...使用 [字符类] 会更容易一些。要将单个\ 与您需要\\\\ 的javascript 字符串匹配,这可能是正在发生的事情。

    new Regexp('^[\\\\/]|[\\\\/]$')

    您也可以尝试/^[\\\/]|[\\\/]$/g 表示法。

    s = 'c:\\folder\\'
    console.log(s.replace(/^[\\\/]|[\\\/]$/g, ''))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多