【问题标题】:RegExp for remove first and last char and turn ending double slashes into single用于删除第一个和最后一个字符并将前导双斜杠变为单斜杠的正则表达式
【发布时间】:2013-05-17 19:06:23
【问题描述】:

我有以下 Javascript 代码从 RegExp 中获取内部字符串:

Function.prototype.method = function (name,func){
    this.prototype[name] = func;
    return this;
};

RegExp.method('toRawString', function(){
    return this.toString().replace(/^.(.*).$/,"$1");
});

这样做的目的是避免在字符串中出现双引号。例如,如果你有一个 Windows 文件路径“C:\My Documents\My Folder\MyFile.file”,你可以像下面这样使用它:

alert(/C:\My Documents\My Folder\MyFile.file/.toRawString());

但是它不适用于 ""C:\My Documents\My Folder\" 因为它会导致语法错误。避免它的唯一方法是在字符串末尾保留双引号。因此它将被写入

alert(/C:\My Documents\My Folder\\/.toRawString());

事实上,字符串末尾的任何奇数个反斜杠都是错误的,因此所有结尾的反斜杠都必须进行双重转义。使用多行小实现并不难,但是有没有单一的 RegExp 解决方案?

注意

当使用toRawString 时,RegExp 对象的this 通常不会用于除该方法之外的任何其他目的。我只想使用 RegExp 的语法来避免源代码中的双反斜杠。不幸的是,结尾的双斜线不能轻易避免。我认为另一种解决方法是在最后强制一个空格,但那是另一个问题。

更新

我终于解决了“另一个问题”并贴出代码here

【问题讨论】:

  • 我想,如果我们真的想成为 hacky,你可以这样做:(function(){/*C:\My Documents\My Folder\MyFile.file*/}).toString().split('*')[1] 并且你不必逃避任何反斜杠!
  • 很好,但还不够好,因为您可能仍需要转义 /[]()。我想出了一个解决方案,只需要使用][,在] 序列的最后一个位置(例如']]]]]' 中的最后一个位置)转义],不仅使用正则表达式,还有字符组。查看我的更新,有代码链接。
  • 不,在该示例中您必须转义的唯一两件事是 **/ 所有其他序列都可以:])/ 等。
  • Emm...唯一不方便的是:除了内容字符串之外还有一个太长的序列。

标签: javascript regex


【解决方案1】:

好的,我明白你想要做什么!这很 hacky :)

尝试类似:

return this.toString().slice(1, -1).replace(/\\+$/, '\\')

希望对您有所帮助。

【讨论】:

  • 啊哈,这看起来很像我要找的东西!
  • 我唯一能看到的是,如果输入字符串以双双斜杠结尾,它仍然是一个错误。所以应该是replace(/(\\\\)(?:\\|$)/,"\\")
  • 或者更好:replace(/\\+$/, '\\')
  • 或者更好:replace(/\\{2,}$/,'\\');
  • @sstur 的答案不正确,因为它不适用于奇数个反斜杠。
【解决方案2】:

如果你想在字符串中包含双引号,只需用单引号括起来即可。

s = '"C:\\My Documents\\My Folder\\MyFile.file"'
console.log(s) // Output => "C:\My Documents\My Folder\MyFile.file"

【讨论】:

  • 我想避免那么多双反斜杠,因为它会阻止我粘贴路径。
  • @Earth Engine:我认为问题的根源在于您不能总是将路径直接粘贴到正则表达式中的原因有很多。带有这些字符的路径呢? . & + ^
  • 只要 RegExp 实际上不用于真正的字符串输入,就不是问题。唯一可能发生的错误是在解析字符串的末尾。实际上,我将在最后强制忽略 ! char 以避免出现问题。
【解决方案3】:

这会产生语法错误:

/C:\My Documents\/

但是这个正则表达式可以这样写:

/C:\\My Documents\\/

或者像这样:

new RegExp("C:\\\\My Documents\\\\")

我认为你的函数很好,并且返回了正确的结果。正则表达式不能以不成对的反斜杠结尾。这并不是说您在双重转义 - 您只是在转义转义字符。

这也会产生错误:

new RegExp("C:\\My Documents\\")

例如,像这样的正则表达式不能在没有一对反斜杠的情况下编写:

/C:\\What/

如果没有第二个反斜杠,\W 将被解释为特殊字符转义序列。所以转义转义字符不仅在最后是必要的。在任何可能被解释为转义序列开始的地方都需要它。因此,在正则表达式中始终使用两个反斜杠来指示反斜杠文字可能是一个很好的经验法则。

【讨论】:

  • 感谢您提供的信息,我想我了解其中的大部分概念。但是,就我而言,我正在寻找一种方法来避免源代码中的双反斜杠,这样我就可以从资源管理器中复制路径并将其粘贴到代码中,而无需手动将单斜杠更改为双斜杠。这就是开发该功能的动机。
  • @Earth Engine:就像我上面提到的,在很多情况下,如果不进行修改,将路径粘贴到正则表达式中将无法正常工作。使用快速函数来转义反斜杠会更容易,即 x.replace(/\\/,"\\\\")
  • 或者更好的是替换(/([\\$^&*.+])/g,"\\$1")
  • 如何在无效字符串上调用replace
  • @Earth Engine:您将字符串粘贴为输入,而不是文字。像这样:jsfiddle.net/ULhNS
猜你喜欢
  • 2020-05-15
  • 2011-04-19
  • 2022-01-27
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
相关资源
最近更新 更多