Javascript RegExp用于删除第一个和最后一个字符,并将结尾的双斜杠转换为单斜杠
我使用以下Javascript代码从RegExp获取内部字符串:Javascript RegExp用于删除第一个和最后一个字符,并将结尾的双斜杠转换为单斜杠,javascript,regex,Javascript,Regex,我使用以下Javascript代码从RegExp获取内部字符串: Function.prototype.method = function (name,func){ this.prototype[name] = func; return this; }; RegExp.method('toRawString', function(){ return this.toString().replace(/^.(.*).$/,"$1"); }); 这样做的目的是避免字符串中的
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
对象通常不会用于除该方法之外的任何其他目的。我只想使用RegExp的语法来避免源代码中的双斜杠。不幸的是,结尾的双斜杠不容易避免。我认为另一种解决方法是在末尾加一个空格,那是另一个问题
更新
我终于解决了“另一个问题”并发布了代码。这会产生一个语法错误:
/C:\My Documents\/
但正则表达式可以这样正确编写:
/C:\\My Documents\\/
new RegExp("C:\\\\My Documents\\\\")
或者像这样:
/C:\\My Documents\\/
new RegExp("C:\\\\My Documents\\\\")
我认为你的函数很好,并且返回了正确的结果。正则表达式不能以不成对的反斜杠结束。这并不是说你在双重转义——你只是在转义转义字符
这也会产生一个错误:
new RegExp("C:\\My Documents\\")
例如,这样的正则表达式如果没有一对反斜杠就无法编写:
/C:\\What/
如果没有第二个反斜杠,\W将被解释为一个特殊的字符转义序列。因此,转义字符不仅在结尾是必需的。在任何可能被解释为转义序列开头的地方都需要转义字符。因此,始终使用两个反斜杠来表示b可能是一个很好的经验法则正则表达式中的反斜杠文字。如果要在字符串中包含双引号,只需将其用单引号括起来即可
s = '"C:\\My Documents\\My Folder\\MyFile.file"'
console.log(s) // Output => "C:\My Documents\My Folder\MyFile.file"
好吧,我明白你想做的事了!很有意思:)
尝试以下方法:
返回此.toString().slice(1,-1)。替换(/\\+$/,“\\\”)
希望这能有所帮助。我希望避免使用太多的双反斜杠,因为它会阻止我粘贴路径。@Earth Engine:我认为问题的根源在于,有很多原因导致无法始终将路径粘贴到正则表达式中。如果路径中包含这些字符,那该怎么办?&+^只要RegExp不是实际的只用于真正的字符串输入,这不是一个问题。唯一可能发生的错误是在解析字符串的末尾。实际上,我将在末尾强制一个被忽略的!
字符以避免问题。啊哈,这看起来很像我要找的!我唯一能看到的是,如果输入字符串以双斜杠结尾,它仍然是一个字符串n错误。因此它应该是replace(/(\\\\)(?:\\\\\\\\$)/,“\\”
或者更好:replace(/\+$/,'\\')或者更好:replace(/\\{2,}$/,'\'\'));
@sstur的答案是不正确的,因为它不适用于奇数个反斜杠。感谢这些信息,我想我理解其中的大多数概念。但是,在我的例子中,我正在寻找一种方法来避免源代码中的双反斜杠,这样我就可以从资源管理器中复制路径并粘贴到代码中,而无需手动更改nge将单斜杠改为双斜杠。这就是开发该函数的动机。@Earth Engine:正如我前面提到的,在很多情况下,将路径粘贴到正则表达式中不需要修改就无法工作。只需使用一个快速函数来避开反斜杠,即x.replace(/\\/,“\\\\”)就更容易了或者更好的方法是替换(/([\$^&*.+])/g,“\\$1”)如何调用无效字符串上的replace
。@Earth Engine:将字符串粘贴为输入,而不是文本。例如:我想如果我们真的想进行黑客攻击,您可以这样做:(函数(){/*C:\My Documents\My Folder\MyFile.file*/})。toString().split('*')[1]
,您不必逃避任何反斜杠!这是一个很好的观点,但还不够好,因为您可能仍然需要逃避/
或[]
,()
。我提出了一个解决方案,只需要在]
序列的最后一个位置用]来逃避]
序列(例如'\\\\\\\\\\\]]]]'中的最后一个)[
,不仅可以使用正则表达式,还可以使用字符组。请参阅我的更新,这里有一个指向代码的链接。不,在该示例中,您必须转义的两件事是*
和*/
所有其他序列都可以:]
,)
,/
等等。嗯……唯一不方便的事情是:除了内容字符串之外,还有一个太长的序列。