Tôi muốn xóa dấu ngoặc kép khỏi Chuỗi


238

Tôi muốn loại bỏ ""một chuỗi.

ví dụ: nếu String là: "I am here"thì tôi chỉ muốn xuất ra I am here.


4
Tại sao bạn không đơn giản sử dụng string.replace ('"', '')
Adarsh ​​Kumar

69
str = str.replace(/"/g,"");
Mr_Green

11
Bạn có muốn xóa TẤT CẢ các trích dẫn hoặc dấu ngoặc kép không?
Kos

36
stackoverflow.com/q/19155566/989121 . Bạn sẽ hỏi 255 câu hỏi, một lần cho mỗi ký tự ASCII?
Georgia

6
str = str.replace(/^"|"$/g, '');thay thế dấu ngoặc kép. Câu trả lời của Mr_Green sẽ thay thế toàn bộ TẤT CẢ "điều không tốt
Kolob Canyon

Câu trả lời:


387

Giả định:

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

Điều đó sẽ tạo nên mánh khóe ... (nếu mục tiêu của bạn là thay thế tất cả các trích dẫn kép).

Đây là cách nó hoạt động:

  • ['"]là một lớp nhân vật, phù hợp với cả dấu ngoặc đơn và dấu ngoặc kép. bạn có thể thay thế bằng "chỉ khớp dấu ngoặc kép.
  • +: một hoặc nhiều dấu ngoặc kép, ký tự, như được định nghĩa bởi lớp char trước (tùy chọn)
  • g: cờ toàn cầu . Điều này nói với JS để áp dụng regex cho toàn bộ chuỗi. Nếu bạn bỏ qua điều này, bạn sẽ chỉ thay thế một char duy nhất.

Nếu bạn đang cố gắng loại bỏ các trích dẫn xung quanh một chuỗi nhất định (nghĩa là theo cặp), mọi thứ sẽ phức tạp hơn một chút. Bạn sẽ phải sử dụng các xác nhận tìm kiếm:

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

Regex giải thích:

  • ": nghĩa đen, phù hợp với bất kỳ nghĩa đen "
  • (: bắt đầu chụp nhóm. Bất cứ điều gì là giữa các dấu ngoặc đơn (() ) sẽ được ghi lại và có thể được sử dụng trong giá trị thay thế.
  • [^"]+: Lớp nhân vật, phù hợp với tất cả các ký tự, ngoại trừ" 1 hoặc nhiều lần
  • (?="): không có chiều rộng bằng không (như không được chụp) khẳng định nhìn tích cực. Trận đấu trước sẽ chỉ có hiệu lực nếu nó được theo sau bởi" theo nghĩa đen
  • ): kết thúc nhóm bắt giữ, chúng tôi đã nắm bắt mọi thứ ở giữa phần mở đầu "
  • ": một nghĩa đen, danh sách cf mục một

Sự thay thế là '$1', đây là một tham chiếu ngược đến nhóm bị bắt đầu tiên, đang tồn tại [^" ]+hoặc xen vào giữa các dấu ngoặc kép. Mẫu phù hợp với cả dấu ngoặc kép và những gì nằm giữa chúng, nhưng chỉ thay thế nó bằng những gì ở giữa dấu ngoặc kép, do đó loại bỏ chúng một cách hiệu quả.
Những gì nó làm là some "string with" quotes-> thay thế "string with"bằng -> string with. Báo giá đi, công việc đã hoàn thành.

Nếu các trích dẫn luôn luôn ở đầu và cuối của chuỗi, thì bạn có thể sử dụng điều này:

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

Với đầu vào remove "foo" delimiting ", đầu ra sẽ không thay đổi, nhưng thay đổi chuỗi đầu vào thành "remove "foo" delimiting quotes"và bạn sẽ kết thúc bằng remove "foo" delimiting quotesđầu ra.

Giải trình:

  • ^": khớp với phần đầu của chuỗi ^và a ". Nếu chuỗi không bắt đầu bằng a ", biểu thức đã thất bại ở đây và không có gì được thay thế.
  • (.+(?="$)): khớp (và chụp) mọi thứ, kể cả trích dẫn kép một hoặc nhiều lần, với điều kiện là cái nhìn tích cực là đúng
  • (?="$): giao diện tích cực giống như trên, chỉ có điều nó xác định rằng " phải là kết thúc của chuỗi ( $=== end)
  • "$: khớp với trích dẫn kết thúc, nhưng không nắm bắt được

Việc thay thế được thực hiện theo cách tương tự như trước đây: chúng tôi thay thế trận đấu (bao gồm các trích dẫn mở và kết thúc), với tất cả mọi thứ bên trong chúng.
Bạn có thể nhận thấy tôi đã bỏ qua gcờ (đối với BTW toàn cầu), vì vì chúng tôi đang xử lý toàn bộ chuỗi, biểu thức này chỉ áp dụng một lần.
Một regex dễ dàng hơn, tương tự, có một điều tương tự (có sự khác biệt bên trong về cách regex được biên dịch / áp dụng) sẽ là:

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

Như trước ^""$khớp với các trích dẫn phân định ở đầu và cuối của chuỗi, và (.+)khớp với mọi thứ ở giữa và nắm bắt nó. Tôi đã thử regex này, cùng với cái ở trên (với sự khẳng định về cái nhìn) và, thừa nhận, với sự ngạc nhiên của tôi thấy cái này chậm hơn một chút. Tôi đoán là xác nhận nhìn có vẻ làm cho biểu thức trước đó bị hỏng ngay khi động cơ xác định không có "ở cuối chuỗi. À, nhưng nếu đây là những gì bạn muốn / cần, xin vui lòng đọc tiếp :

Tuy nhiên, trong trường hợp cuối cùng này, nó an toàn hơn, nhanh hơn, dễ bảo trì hơn và tốt hơn để làm điều này:

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

Ở đây, tôi đang kiểm tra xem char đầu tiên và cuối cùng trong chuỗi có phải là dấu ngoặc kép hay không. Nếu có, tôi đang sử dụng substrđể cắt bỏ những ký tự đầu tiên và cuối cùng. Chuỗi không có chỉ mục, vì vậy char cuối cùng là charAt(str.length -1). substrmong đợi 2 đối số, trong đó đầu tiên là phần bù mà chuỗi con bắt đầu, chuỗi thứ hai là độ dài của nó. Vì chúng ta không muốn char cuối cùng, hơn nữa chúng ta muốn thứ nhất, độ dài đó là str.length - 2. Dễ đậu.

Mẹo :

Thông tin thêm về các xác nhận có vẻ có thể được tìm thấy ở đây
Regex rất hữu ích (và IMO vui vẻ), ban đầu có thể hơi khó hiểu. Dưới đây là một số chi tiết và liên kết đến các tài nguyên về vấn đề này.
Nếu bạn chưa cảm thấy thoải mái khi sử dụng regex, bạn có thể muốn xem xét sử dụng:

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

Nếu có nhiều trích dẫn trong chuỗi, điều này thậm chí có thể nhanh hơn sử dụng regex


1
@rid: Tôi đã chỉnh sửa, mở rộng một chút về biểu thức làm gì và cách tùy chỉnh nó
Elias Van Ootegem

83
str = str.replace(/^"(.*)"$/, '$1');

Regrec này sẽ chỉ xóa các trích dẫn nếu chúng là ký tự đầu tiên và cuối cùng của chuỗi. F.ex:

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

63

Nếu chuỗi được đảm bảo có một trích dẫn (hoặc bất kỳ ký tự đơn nào khác) ở đầu và cuối mà bạn muốn xóa:

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

slice có ít chi phí hơn nhiều so với một biểu thức thông thường.


8
Tại sao các downvote? '"Tôi ở đây"'. Lát (1, -1) -> 'Tôi ở đây'!
darrinm

2
Ngạc nhiên là điều này đã bị hạ cấp vì nó chính xác là loại hoạt động 'nhanh chóng' mà bạn cần nếu bạn đang xử lý các chữ RDF (ví dụ, trong N3, URI thường được ký hiệu là như <uri>và nghĩa đen "literal"). Vì vậy, đây là một upvote. ;)
Mark Birbeck 20/03/18

2
(Đặc biệt vì câu hỏi ban đầu nói rằng họ muốn xóa các trích dẫn xung quanh một chuỗi.)
Mark Birbeck 20/03/18

2
Đây phải là câu trả lời được chấp nhận vì nó thực hiện chính xác những gì đã được hỏi, và nó thực hiện nó một cách hiệu quả.
Pascal

38

Nếu bạn có quyền kiểm soát dữ liệu của mình và bạn biết dấu ngoặc kép của mình bao quanh chuỗi (vì vậy không xuất hiện bên trong chuỗi) và chuỗi là số nguyên ... hãy nói với:

"20151212211647278"

hoặc tương tự điều này độc đáo loại bỏ các trích dẫn xung quanh

JSON.parse("20151212211647278");

Không phải là một câu trả lời phổ quát tuy nhiên lắt léo cho nhu cầu thích hợp


Điều này sẽ xảy ra lỗi trên FireFox với: SyntaxError: JSON.parse: ký tự không mong muốn ở dòng 1 cột 1 của dữ liệu JSON
Ben Pretorius

không ... hoạt động tốt trên bản phát hành mới của FireFox
Scott Stensland 28/03/2016

JSON.parse ("{123123}"); điều này sẽ thổi bay câu trả lời của bạn
Abhijeet

3
JSON.parse("20151212211647278dfvs"); SyntaxError: Unexpected token d in JSON at position 17
Khởi động lại hệ thống

1
tôi đã gặp lỗi SyntaxError: Mã thông báo bất ngờ <trong JSON ở vị trí 0
Freddy Sidauruk

16

Nếu bạn chỉ muốn xóa dấu ngoặc kép:

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

Cách tiếp cận này sẽ không chạm vào chuỗi nếu nó không giống như vậy "text in quotes".


2
Sử dụng a.charAt(x)nếu bạn muốn hỗ trợ <ECMA5 (f.ex IE7).
David Hellsing

8

Nếu bạn chỉ muốn xóa dấu ngoặc kép từ đầu hoặc cuối, hãy sử dụng biểu thức chính quy sau:

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

1
Lưu ý điều này cũng sẽ thay đổi "foofoo". Người ta chỉ có thể muốn bỏ cả cặp này.
Kos

Cảm ơn đã lưu ý, tôi nghĩ rằng đó là một hành vi dự kiến, mặc dù.
Denis

5

Để phục hồi vấn đề của bạn theo cách dễ diễn đạt hơn như một biểu thức thông thường:

Lấy chuỗi con của các ký tự được chứa giữa 0 hoặc một dấu ngoặc kép hàng đầu và 0 hoặc một dấu ngoặc kép.

Đây là biểu thức chính quy thực hiện điều đó:

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

Phá vỡ regrec:

  • ^"? một trận đấu tham lam cho số không hoặc một dấu ngoặc kép hàng đầu
  • "?$ một trận đấu tham lam cho không hoặc một dấu ngoặc kép
  • hai kẻ tấn công đó là một kẻ bắt giữ không tham lam của tất cả các nhân vật khác (.+?), sẽ chứa mục tiêu là $1.

Điều này sẽ trở lại delimited "string" herecho:

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

5

Một lớp lót cho những người lười biếng

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

Đây là câu trả lời thích hợp nhất. /"/gsẽ không làm việc cho "My name is \"Jason\"".
Jason Liu

câu trả lời này loại bỏ mọi trích dẫn ở đầu và cuối, không tốt trong trường hợp " - is a quotechuỗi, vì vậy nó không giống như xung quanh
vladkras

2

Những công việc này...

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));


mã sai Hãy thử nhập chuỗi rỗng hoặc thử 'foo"hoặc đơn giảnfoo"
Pavel P

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

Điều này có thể làm việc cho bạn.


0

Nếu bạn muốn xóa tất cả dấu ngoặc kép trong chuỗi, hãy sử dụng

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

Nếu không, bạn muốn xóa chỉ trích dẫn xung quanh chuỗi, sử dụng:

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

0

Mã đơn giản này cũng sẽ hoạt động, để loại bỏ ví dụ trích dẫn kép từ một chuỗi được bao quanh với trích dẫn kép:

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

0

Nếu bạn đang cố xóa dấu ngoặc kép, hãy thử làm theo

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

0

mã này là tốt hơn cho số hiển thị trong hộp văn bản

$ (này) = [hộp văn bản của bạn]

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

-2

Vui lòng thử regex sau để xóa dấu ngoặc kép khỏi chuỗi.

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

2
Họ muốn một giải pháp javascript!
Toto
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.