我想从字符串中删除双引号
我想删除字符串周围的。""
例如,如果字符串是:,那么我只想输出。"I am here"
I am here
我想删除字符串周围的。""
例如,如果字符串是:,那么我只想输出。"I am here"
I am here
若:
var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));
这应该可以解决问题...(如果您的目标是替换所有双引号)。
以下是它的工作原理:
['"]
是一个字符类,匹配单引号和双引号。您可以将其替换为仅匹配双引号。"
+
:一个或多个引号,字符,由前面的字符类定义(可选)g
:全局标志。这告诉 JS 将正则表达式应用于整个字符串。如果省略此项,则只会替换单个字符。如果你试图删除给定字符串(即成对)周围的引号,事情会变得更加棘手。您必须使用查找断言:
var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove foo delimiting quotes
str = 'remove only "foo" delimiting "';//note trailing " at the end
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove only foo delimiting "<-- trailing double quote is not removed
正则表达式解释说:
"
:文字,匹配任何文字"
(
:开始捕获组。括号 () 之间的任何内容都将被捕获,并且可以在替换值中使用。()
[^"]+
:字符类,匹配所有字符,1 次或更多次除外"
(?=")
:零宽度(如未捕获的)正前瞻断言。仅当前一个匹配项后跟文字时,它才有效"
)
:结束捕获组,我们已经捕获了开场关闭之间的所有内容"
"
:另一个文字,cf 列表项一替换是 ,这是对第一个捕获的组的反向引用,在双引号之间是 或 everyting。该模式同时匹配引号和它们之间的内容,但仅将其替换为引号之间的内容,从而有效地删除它们。
它的作用是 -> 替换为 -> 。报价消失了,工作完成了。'$1'
[^" ]+
some "string with" quotes
"string with"
string with
如果引号总是在字符串的开头和结尾,那么你可以使用这个:
str.replace(/^"(.+(?="$))"$/, '$1');
或者对于双引号和单引号:
str.replace(/^["'](.+(?=["']$))["']$/, '$1');
使用输入删除“foo”分隔符“
,输出将保持不变,但将输入字符串更改为”删除“foo”分隔引号“
,你最终会得到输出。remove "foo" delimiting quotes
解释:
^"
:匹配字符串的开头和 .如果字符串不以 a 开头,则表达式在此处已失败,并且不会替换任何内容。^
"
"
(.+(?="$))
:匹配(并捕获)所有内容,包括一次或多次双引号,前提是正面观察结果为真(?="$)
:正前方与上面大致相同,只是它指定必须为字符串的结尾( === end)"
$
"$
:匹配该结束引号,但不捕获它替换以与以前相同的方式完成:我们将匹配(包括开始和结束引号)替换为其中的所有内容。
您可能已经注意到我省略了标志(对于全局BTW),因为由于我们正在处理整个字符串,因此此表达式仅应用一次。
一个更简单的正则表达式,几乎可以做同样的事情(正则表达式的编译/应用方式存在内部差异)将是:g
someStr.replace(/^"(.+)"$/,'$1');
与以前一样,匹配字符串开头和结尾处的分隔引号,匹配两者之间的所有内容,并捕获它。我已经尝试了这个正则表达式,与上面的正则表达式(带有前瞻断言)一起,并且,不可否认,我的surprize发现这个正则表达式稍微慢一些。我的猜测是,一旦引擎确定字符串末尾没有,Lookround断言就会导致前面的表达式失败。嗯,但是如果这是你想要/需要的,请继续阅读:^"
"$
(.+)
"
但是,在最后一种情况下,这样做更安全,更快,更易于维护,并且更好:
if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
console.log(str.substr(1,str.length -2));
}
在这里,我正在检查字符串中的第一个和最后一个字符是否是双引号。如果是这样,我用它来切断那些第一个和最后一个字符。字符串的索引为零,因此最后一个字符是 . 期望 2 个参数,其中第一个是子字符串开始的偏移量,第二个是其长度。由于我们不需要最后一个字符,就像我们想要第一个字符一样,因此该长度为 。容易啃咬。substr
charAt(str.length -1)
substr
str.length - 2
温馨提示:
更多关于查看断言可以在这里
找到 正则表达式非常有用(和IMO的乐趣),一开始可能会有点尴尬。以下是一些更多详细信息,以及有关此事的资源链接。
如果您还不太喜欢使用正则表达式,则可能需要考虑使用:
var noQuotes = someStr.split('"').join('');
如果字符串中有很多引号,这甚至可能比使用正则表达式更快
str = str.replace(/^"(.*)"$/, '$1');
此正则表达式将仅删除引号,如果它们是字符串的第一个和最后一个字符。例如:
"I am here" => I am here (replaced)
I "am" here => I "am" here (untouched)
I am here" => I am here" (untouched)