a

Câu hỏi Làm cách nào để kiểm tra xem chuỗi có chứa chuỗi con trong JavaScript không?


Thông thường tôi sẽ mong đợi một String.contains() nhưng dường như không có.

Một cách hợp lý để kiểm tra điều này là gì?


7436
2017-11-24 13:05


gốc


Thật dễ dàng với phương thức indexOf, bạn có thể thấy một hướng dẫn về indexOf và chuỗi con tại đây: dreamsyssoft.com/javascript-shell-scripting/… - Triton Man
có thể trùng lặp Chuỗi JQuery chứa kiểm tra - Saswat
bạn có thể thấy tốc độ của r.indexOf(s) !== -1; nhanh nhất so với những người khác. hayageek.com/javascript-string-contains - Sherali Turdiyev
Đây là điểm chuẩn cho các cách phổ biến nhất để kiểm tra xem chuỗi có nằm trong chuỗi không: jsben.ch/#/o6KmH - EscapeNetscape
Video bao gồm các tùy chọn tốt nhất dưới đây trong <5 phút, tại đây: youtube.com/watch?v=KENPi0xTgcE - ssmith


Các câu trả lời:


Dưới đây là danh sách các khả năng hiện tại:

1. (ES6) includes- -đi đến câu trả lời

var string = "foo",
    substring = "oo";
string.includes(substring);

2. ES5 trở lên indexOf

var string = "foo",
    substring = "oo";
string.indexOf(substring) !== -1;

String.prototype.indexOf trả về vị trí của chuỗi trong chuỗi khác. Nếu không tìm thấy, nó sẽ trở lại -1.

3. search- -đi đến câu trả lời

var string = "foo",
    expr = /oo/;
string.search(expr);

4. lodash bao gồm- -đi đến câu trả lời

var string = "foo",
    substring = "oo";
_.includes(string, substring);

5. RegExp- -đi đến câu trả lời

var string = "foo",
    expr = /oo/;  // no quotes here
expr.test(string);

6. Phù hợp- -đi đến câu trả lời

var string = "foo",
    expr = /oo/;
string.match(expr);

Kiểm tra hiệu năng đang cho thấy rằng indexOf có thể là lựa chọn tốt nhất, nếu nói đến vấn đề tốc độ.


11489
2017-12-30 04:23



@Steve indexOf luôn trả về một số để không cần sử dụng !==. Nếu bạn muốn lưu byte, bạn có thể sử dụng ~'foo'.indexOf('oo') trả về giá trị trung thực nếu chuỗi con được tìm thấy và giá trị giả (0) nếu không. - Mathias Bynens
Đối với những người tò mò: trong hai hệ thống khen ngợi, -1 được biểu diễn dưới dạng nhị phân như tất cả 1s (1111 1111 1111 1111 1111 1111 1111 1111 cho 32 bit). Nghịch đảo bitwise (~) của điều này là tất cả các số không, hoặc chỉ bằng 0, và do đó bị lỗi. Đó là lý do tại sao các mẹo squiggle hoạt động, và nó là khá xấu-ass nếu tôi phải nói như vậy bản thân mình. - Adam Tolley
@SebNilsson Bạn quên bao gồm ~ nhà điều hành mà tôi đã đề xuất trong nhận xét của tôi. ~'hello'.indexOf('h'); // -1, which is truthy, nhưng ~'hello'.indexOf('x'); // 0, which is falsy. - Mathias Bynens
@ pramodc84 liên kết đó đề cập đến Array vật indexOf phương pháp không cho String phương pháp đối tượng - gion_13
@NicolasBarbulesco Tôi tin rằng tất cả những người nhìn vào mã của tôi sẽ biết rằng [["\t\n 987654321e-400"]] === 0 là sai. Tôi ít tự tin hơn rằng mọi người nhìn vào mã của tôi sẽ biết rằng [["\t\n 987654321e-432"]] == 0 là đúng. - kybernetikos


Bạn có thể dễ dàng thêm contains method với String với câu lệnh sau:

String.prototype.contains = function(it) { return this.indexOf(it) != -1; };

Chú thích: xem các bình luận bên dưới để có một đối số hợp lệ để không sử dụng điều này. Lời khuyên của tôi: sử dụng phán đoán của riêng bạn.

Ngoài ra:

if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; }

823
2017-11-24 14:17



Không sửa đổi các đối tượng bạn không sở hữu. nczonline.net/blog/2010/03/02/… - zachleat
@ zachleat, có thể hiểu được trong thực tế. Nhưng "foobar" .contains ("bar") sẽ là một ngoại lệ thực sự hữu ích cho quy tắc. - ndbroadbent
Eh, sở thích của tôi sẽ thích ứng với mô hình tinh thần của tôi để phù hợp với JavaScript và chỉ sử dụng indexOf. Nó sẽ làm cho mã dễ hiểu hơn cho JavaScripter tiếp theo đi kèm và phải đọc nó. - zachleat
if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; } - Pavel Hodek
Tôi này nó là thích hợp hơn để sử dụng chức năng này nếu bạn sẽ được sử dụng loại indexOf thường xuyên. @ zachleat, tôi sẽ không đồng ý rằng việc sử dụng indexOf dễ đọc hơn chứa. Chứa mô tả những gì đang xảy ra, ở đâu với một số indexOf() != -1 có thể không quá minh bạch. Nhưng với từng cái của riêng họ, miễn là bạn là người kiên định. - smdrager


Vấn đề với mã của bạn là JavaScript phân biệt chữ hoa chữ thường. Cuộc gọi phương thức của bạn

indexof()

thực sự nên là

indexOf()

Hãy thử sửa chữa nó và xem điều đó có giúp ích không:

if (test.indexOf("title") !=-1) {
    alert(elm);
    foundLinks++;
}

429
2018-01-07 10:23



@ JeremyW, tôi sẽ nói vào thời điểm này giá trị của câu trả lời này là những người đã mắc sai lầm chính xác này (indexof thay vì indexOf) có thể tìm thấy câu trả lời này và xem những gì đang xảy ra. Tôi sẽ không chạm vào câu hỏi nữa. - Victor


Đây là một string.includes trong ES6:

"potato".includes("to");
> true

Lưu ý bạn có thể cần tải es6-shim hoặc tương tự để làm việc này trên các trình duyệt cũ hơn.

require('es6-shim')

361
2017-11-24 13:06



bởi vì tôi đã từng được sử dụng để "chứa" trong các ngôn ngữ khác và chỉ cần thực hiện tính năng của tôi với nó, tôi chỉ chạy vào lỗi. Vì vậy, phản hồi ngắn về sự hỗ trợ. Firefox 19 - OSX => OK, Firefox 19 - Windows => NOK, Chrome - OSX, Windows => NOK - Patrick Hammer
Như thế này? String.prototype.contains = function (segment) { return this.indexOf(segment) !== -1; }; (BTW: Làm mọi thứ trên nguyên mẫu là xấu) - Nijikokun
Nó không hỗ trợ trong chrome ..... :( - Krunal Patel
@ Norris Đó là trong ES6. Tải ES6 shim. Bạn có thể sử dụng nó ngay bây giờ. - mikemaccana
.contains () và .includes () đều là thử nghiệm, lại: không chuẩn. Tôi sẽ không khuyến nghị sử dụng chúng trong các hệ thống sản xuất. Tôi muốn gắn bó với .indexOf () bây giờ. - Mike S.


var index = haystack.indexOf(needle);

341
2018-03-05 09:53





Bạn có thể sử dụng JavaScript search() phương pháp.

Cú pháp là: string.search(regexp)

Nó trả về vị trí của trận đấu, hoặc -1 nếu không tìm thấy trận đấu nào.

Xem ví dụ ở đó: jsref_search

Bạn không cần cú pháp biểu thức chính quy phức tạp. Nếu bạn không quen thuộc với họ một cách đơn giản st.search("title") sẽ làm. Nếu bạn muốn thử nghiệm của bạn là trường hợp không nhạy cảm, thì bạn nên làm st.search(/title/i).


237
2017-10-21 05:31



Điều này có vẻ như nó sẽ chậm hơn hàm indexOf vì nó sẽ phải phân tích cú pháp RegEx. Tuy nhiên, nếu bạn muốn một cái gì đó không nhạy cảm, cách của bạn sẽ là con đường để đi (tôi nghĩ), mặc dù đó không phải là những gì được hỏi. Mặc dù nó không được hỏi, tôi sẽ bỏ phiếu cho điều này chỉ  bởi vì của tùy chọn không phân biệt chữ hoa chữ thường. - bgw
Tôi chưa chạy điểm chuẩn, nhưng sẽ str.toLowerCase().indexOf(searchstr.toLowerCase()) hiệu quả hơn cho tìm kiếm phân biệt chữ hoa chữ thường? - Tim S.
Với một điểm chuẩn và nó quay ra tìm kiếm là hiệu quả hơn cho trường hợp tìm kiếm không nhạy cảm. jsperf.com/string-compare-perf-test Nhưng nó có thể là khó khăn để sử dụng tìm kiếm regex khi bạn cần phải thoát khỏi một số ký tự. - misaxi
Tìm kiếm có thể dẫn đến lỗi. Như misaxi nói, sau đó bạn phải thoát khỏi một số nhân vật. Tôi đã sử dụng tìm kiếm không nhận ra rằng tham số mong đợi một regex và đang tìm kiếm ký tự ống. Khi nó quay ra, bất kỳ chuỗi .search ('|') == 0. - James Foster
Bạn có thể sử dụng một hàm escapeRegExp để làm cho văn bản serach an toàn. function escapeRegExp(string){ return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); } từ developer.mozilla.org/en/docs/Web/JavaScript/Guide/… - Mark


String.prototype.includes() đã được giới thiệu trong ES6.

Xác định xem một chuỗi có thể được tìm thấy trong chuỗi khác không,   trả về đúng hoặc sai khi thích hợp.

Cú pháp

var contained = str.includes(searchString [, position]);  

Thông số

searchString

Một chuỗi được tìm kiếm trong chuỗi này.

position

Vị trí trong chuỗi này để bắt đầu tìm kiếm searchString mặc định là 0.

Thí dụ

var str = "To be, or not to be, that is the question.";

console.log(str.includes("To be"));    // true
console.log(str.includes("question")); // true
console.log(str.includes("To be", 1)); // false  

chú thích

Điều này có thể yêu cầu ES6 shim trong các trình duyệt cũ hơn.


167
2018-05-29 07:46



FWIW trang MDN được liên kết có một shim / polyfill đơn giản: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Salman Abbas


Nếu bạn đang tìm kiếm một cách thay thế để viết kiểm tra xấu xí -1, bạn sẽ thêm một dấu ngã ~ vào thay thế.

if (~haystack.indexOf('needle')) alert('found');

Joe Zimmerman - bạn sẽ thấy rằng việc sử dụng ~ on -1 sẽ chuyển đổi thành 0. Số 0 là   giá trị falsey, có nghĩa là nó sẽ đánh giá sai khi chuyển đổi thành   một Boolean. Điều đó có vẻ không phải là một cái nhìn sâu sắc lúc đầu, nhưng   nhớ các hàm như indexOf sẽ trả về -1 khi truy vấn không   tìm. Điều này có nghĩa là thay vì viết một cái gì đó tương tự như thế này:

if (someStr.indexOf("a") >= 0) {
  // Found it
} else  {
  // Not Found
}

Bây giờ bạn có thể có ít ký tự hơn trong mã của mình để bạn có thể viết   như thế này:

if (~someStr.indexOf("a")) {
  // Found it
} else  {
  // Not Found
}

Hơn chi tiết tại đây


120
2017-09-13 03:45



Có, bây giờ tôi muốn khuyên bạn nên polyfill tiêu chuẩn ES6 includes() bằng cách làm theo điều này: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Christian Landgren