Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RegExp用于删除第一个和最后一个字符,并将结尾的双斜杠转换为单斜杠_Javascript_Regex - Fatal编程技术网

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"); }); 这样做的目的是避免字符串中的

我使用以下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
对象通常不会用于除该方法之外的任何其他目的。我只想使用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]
,您不必逃避任何反斜杠!这是一个很好的观点,但还不够好,因为您可能仍然需要逃避
/
[]
()
。我提出了一个解决方案,只需要在
]
序列的最后一个位置用
]来逃避
]
序列(例如'\\\\\\\\\\\]]]]'中的最后一个)[
,不仅可以使用正则表达式,还可以使用字符组。请参阅我的更新,这里有一个指向代码的链接。不,在该示例中,您必须转义的两件事是
*
*/
所有其他序列都可以:
]
/
等等。嗯……唯一不方便的事情是:除了内容字符串之外,还有一个太长的序列。