我想从字符串中删除双引号

我想删除字符串周围的""

例如,如果字符串是:"I am here",那么我只想输出I am here

597978 次浏览

假设:

var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));

这应该能奏效……(如果你的目标是替换所有双引号)。

下面是它的工作原理:

  • ['"]是一个字符类,同时匹配单引号和双引号。你可以用"替换它,只匹配双引号。
  • +:一个或多个引号,字符,由前面的char-class定义(可选)
  • g: 全球标志。这告诉JS将正则表达式应用于整个字符串。如果省略这个,您将只替换一个字符。

如果您试图删除给定字符串周围的引号(即成对),事情会变得有点棘手。你必须使用lookaround断言:

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

正则表达式解释道:

  • ": literal,匹配任何literal "
  • (:开始捕获组。括号(())之间的内容将被捕获,并可用于替换值。
  • [^"]+:字符类,匹配所有字符,除了" 1次或更多次
  • (?="): zero-width(如未捕获)正向前视断言。前一个匹配只有在后面有"字面值时才有效
  • ):结束捕获组,我们已经捕获了在开始结束"之间的所有内容
  • ":另一个字面值,cf列表项1
替换为'$1',这是对第一个捕获组的反向引用,即[^" ]+,或双引号之间的所有内容。该模式匹配双引号和引号之间的内容,但只替换双引号之间的内容,从而有效地删除它们 它的作用是some "string with" quotes ->用->替换"string with";string with

如果引号总是将位于字符串的开头和结尾,那么您可以使用:

str.replace(/^"(.+(?="$))"$/, '$1');

或者对于双引号和单引号:

str.replace(/^["'](.+(?=["']$))["']$/, '$1');

对于输入remove "foo" delimiting ",输出将保持不变,但将输入字符串更改为"remove "foo" delimiting quotes",最终输出将是remove "foo" delimiting quotes

解释:

  • ^":匹配字符串^"的开头。如果字符串不是以"开头,则表达式在这里已经失败,并且没有替换任何内容。
  • (.+(?="$)):匹配(并捕获)所有内容,包括一次或多次双引号,前提是正向正向为真
  • (?="$):正向前向与上面的内容大致相同,只是它指定" 必须是字符串的结尾($ === end)
  • "$:匹配结尾引号,但不捕获它
替换的方式与之前相同:我们将匹配(包括开引号和闭引号)替换为其中的所有内容。
你可能已经注意到我省略了g标志(用于全局BTW),因为因为我们处理的是整个字符串,所以这个表达式只应用一次 一个更简单的regex做的几乎是同样的事情(regex如何编译/应用有内部差异)将是:

someStr.replace(/^"(.+)"$/,'$1');

如上所述,^""$匹配字符串开头和结尾的分隔引号,而(.+)匹配两者之间的所有内容,并捕获它。我已经尝试了这个正则表达式,以及上面的一个正则表达式(带有超前断言),不可否认,让我惊讶的是,我发现这个正则表达式稍微慢一些。我的猜测是,只要引擎确定字符串末尾没有", lookaround断言就会导致前面的表达式失败。好吧,但如果这是你想要/需要的,请请继续阅读:

然而,在最后一种情况下,这样做更安全、更快、更可维护,而且更好:

if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
console.log(str.substr(1,str.length -2));
}

在这里,我检查字符串中的第一个和最后一个字符是否为双引号。如果是,我将使用substr切断第一个和最后一个字符。字符串是零索引的,所以最后一个字符是charAt(str.length -1)substr需要2个参数,其中第一个是子字符串开始的偏移量,第二个是子字符串的长度。因为我们不想要最后一个字符,就像我们不想要第一个字符一样,所以这个长度是str.length - 2。Easy-peazy。

提示:

更多关于lookaround断言可以在这里找到
正则表达式非常有用(在我看来也很有趣),一开始可能会有点困惑。这里有更多的细节和资源链接关于这个问题。
如果你还不太习惯使用正则表达式,你可能会考虑使用:

var noQuotes = someStr.split('"').join('');

如果字符串中有很多引号,这甚至可能比使用regex更快

如果你只想删除边界引号:

function stripquotes(a) {
if (a.charAt(0) === '"' && a.charAt(a.length-1) === '"') {
return a.substr(1, a.length-2);
}
return a;
}

如果字符串不像"text in quotes",此方法将不会触及字符串。

如果只想从开头或结尾删除引号,请使用以下正则表达式:

'"Hello"'.replace(/(^"|"$)/g, '');

如果要删除字符串中的所有双引号,请使用

var str = '"some "quoted" string"';
console.log( str.replace(/"/g, '') );
// some quoted string

否则,你想要删除字符串周围的引号,使用:

var str = '"some "quoted" string"';
console.log( clean = str.replace(/^"|"$/g, '') );
// some "quoted" string
str = str.replace(/^"(.*)"$/, '$1');

只有当引号是字符串的第一个和最后一个字符时,这个regexp才会删除引号。F.ex:

"I am here"  => I am here (replaced)
I "am" here  => I "am" here (untouched)
I am here"   => I am here" (untouched)

以一种更容易用正则表达式表达的方式重申你的问题:

获取包含在0或1个开头双引号和0或1个结尾双引号之间的字符的子字符串。

下面是执行此操作的regexp:

  var regexp = /^"?(.+?)"?$/;
var newStr = str.replace(/^"?(.+?)"?$/,'$1');

分解regexp:

  • ^"?一个贪婪匹配0或一个前导双引号
  • "?$一个贪婪匹配0或一个尾随双引号
  • 这两个标记了对所有其他字符(.+?)的非贪婪捕获,它将包含$1的目标。

这将返回delimited "string" here用于:

str = "delimited "string" here"  // ...
str = '"delimited "string" here"' // ...
str = 'delimited "string" here"' // ... and
str = '"delimited "string" here'

这个简单的代码也可以工作,例如从双引号包围的字符串中删除双引号:

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"(.+)"/g, '$1'));

如果你可以控制你的数据,你知道你的双引号包围字符串(所以不出现在字符串中),字符串是一个整数…用:

"20151212211647278"

或者类似的,这很好地删除了周围的引号

JSON.parse("20151212211647278");

这不是一个通用的答案,但巧妙地满足了利基需求

这是为懒人设计的一款简单的工具

var str = '"a string"';
str = str.replace(/^"|"$/g, '');

如果字符串保证在开头和结尾有一个引号(或任何其他单个字符),你想删除:

str = str.slice(1, -1);

slice的开销比正则表达式小得多。

这工作…

var string1 = "'foo'";
var string2 = '"bar"';


function removeFirstAndLastQuotes(str){
var firstChar = str.charAt(0);
var lastChar = str[str.length -1];
//double quotes
if(firstChar && lastChar === String.fromCharCode(34)){
str = str.slice(1, -1);
}
//single quotes
if(firstChar && lastChar === String.fromCharCode(39)){
str = str.slice(1, -1);
}
return str;
}
console.log(removeFirstAndLastQuotes(string1));
console.log(removeFirstAndLastQuotes(string2));

var expressionWithoutQuotes = '';
for(var i =0; i<length;i++){
if(expressionDiv.charAt(i) != '"'){
expressionWithoutQuotes += expressionDiv.charAt(i);
}
}

这可能对你有用。

请尝试使用regex从字符串中删除双引号。

    $string = "I am here";
$string =~ tr/"//d;
print $string;
exit();

如果您试图删除双引号,请尝试以下操作

  var Stringstr = "\"I am here\"";
var mystring = String(Stringstr);
mystring = mystring.substring(1, mystring.length - 1);
alert(mystring);

这段代码是非常好的显示数字在文本框

$(this) =[你的文本框]

            var number = $(this).val();
number = number.replace(/[',]+/g, '');
number = number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
$(this).val(number); // "1,234,567,890"

如果你想要守旧,请使用REGEX 1,$s/"//g