regex.test VS string.match để biết nếu một chuỗi khớp với biểu thức chính quy


287

Nhiều lần tôi đang sử dụng matchhàm chuỗi để biết một chuỗi có khớp với biểu thức chính quy hay không.

if(str.match(/{regex}/))

Có sự khác biệt nào giữa cái này không:

if (/{regex}/.test(str))

Họ dường như cho kết quả tương tự?


4
đây là những bài kiểm tra tốt nhất mà bạn sẽ tìm thấy jsperf.com/regapi-test-vs-match-m5
ajax333221

@ ajax333221. Cảm ơn jsperf, nhưng tôi không chắc nó là một cái tốt. Kết hợp regex bằng cách sử dụng nhóm khớp, không cần thiết khi tìm giá trị boolean.
gdoron đang hỗ trợ Monica

Câu trả lời:


440

Cách sử dụng cơ bản

Trước tiên, hãy xem mỗi chức năng làm gì:

regexObject . kiểm tra ( Chuỗi )

Thực hiện tìm kiếm đối sánh giữa một biểu thức chính quy và một chuỗi được chỉ định. Trả về đúng hay sai .

chuỗi . khớp ( RegExp )

Được sử dụng để truy xuất các kết quả khớp khi khớp chuỗi với biểu thức chính quy. Trả về một mảng với các kết quả khớp hoặc nullnếu không có.

Kể từ khi nullđánh giá false,

if ( string.match(regex) ) {
  // There was a match.
} else {
  // No match.
} 

Hiệu suất

Có sự khác biệt nào về hiệu suất không?

. Tôi tìm thấy ghi chú ngắn này trong trang MDN :

Nếu bạn cần biết một chuỗi có khớp với biểu thức chính quy hay không, hãy sử dụng regrec.test (chuỗi).

Là sự khác biệt đáng kể?

Câu trả lời một lần nữa là ! JsPerf này tôi đặt cùng nhau cho thấy sự khác biệt là ~ 30% - ~ 60% tùy thuộc vào trình duyệt:

kiểm tra vs trận đấu |  Kiểm tra hiệu suất

Phần kết luận

Sử dụng .testnếu bạn muốn kiểm tra boolean nhanh hơn. Sử dụng .matchđể truy xuất tất cả các trận đấu khi sử dụng gcờ toàn cầu.


5
Không quá ngạc nhiên vì hàm chuỗi cần lật mọi thứ và sau đó tạo Mảng nếu có khớp. Có vẻ như tôi sẽ tiếp tục sử dụng .test(). :)

22
Hai xu của tôi: hiệu suất được đánh giá cao. Một trong hai tùy chọn có thể thực hiện ~ 15.000 thao tác trong nháy mắt của màn hình, vì vậy trừ khi bạn thực hiện hàng loạt regex phía máy khách, tốc độ không liên quan. Tất nhiên, 'test' là hàm chính xác nếu kết quả boolean là thứ bạn đang theo đuổi. Cảm ơn Q / A BTW.
David Gilbertson

2
Thử nghiệm thú vị là chậm hơn 41% so với đối sánh với tôi khi sử dụng thử nghiệm jsPerf ở trên (Chrome 41, OSX).
Benjie

1
@AlexShilman indexOf nhanh hơn (nhưng không nhiều) so với thử nghiệm theo stackoverflow.com/questions/183496/ này (bạn mong đợi nó sẽ nhanh hơn).
podperson

1
Một điều có thể cắn bạn ở đây (nó cắn nhóm của tôi gần đây): Nếu bạn sử dụng cờ 'g' trên Regex của mình và tạo một phiên bản mới (tức là thông qua RegExp mới (<regex_str>, 'g')) và bạn sử dụng lại ví dụ, chạy "test" là trạng thái, tức là sẽ trả về các kết quả khác nhau khi chạy nhiều lần. Xem developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Khăn để biết chi tiết.
davertron

118

Đừng quên xem xét cờ toàn cầu trong regrec của bạn:

var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi');    // => true
reg.test('abcdefghi');    // => false <=

Điều này là do Regapi theo dõi chỉ số cuối cùng khi tìm thấy kết quả khớp mới.


21
Tôi vừa mới đập đầu khi thấy rằng regex.test () của tôi đã đăng nhập ngẫu nhiên "đúng" rồi "sai" rồi "đúng" ... cảm ơn!
adriendenat

7
Tôi nghĩ rằng đây là câu trả lời tốt hơn. Nó giải thích rằng họ không đưa ra kết quả tương tự và reg.test () có một cạm bẫy nguy hiểm. Đối với tôi điều này làm cho string.match () là sự lựa chọn rõ ràng. Hiệu suất chưa bao giờ là bất kỳ vấn đề đối với tôi.
James

2
Điều này quan trọng! Phát điên khi cố gắng tìm ra lý do tại sao mọi kết quả khác đều bị thiếu ... để tham khảo bất kỳ ai khác tìm thấy điều này: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/,
Dan

2
Nếu bạn bối rối như tôi, hãy xem stackoverflow.com/q/1520800/3714913 . Ngoài ra còn có String.prototype.search () , trả về một chỉ mục nhưng không có vấn đề này theo như tôi có thể nói.
Nateowami

3
Chỉ tò mò, quan điểm của việc có một lá cờ toàn cầu là .test()gì? không phải là điểm .test()để kiểm tra xem chuỗi có regex phù hợp không?
buhbang

0

Đây là kết quả điểm chuẩn của tôi kết quả điểm chuẩn

kiểm tra 4.267.740 ops / giây ± 1.32% (60 lần lấy mẫu)

thực hiện 3.649.719 ops / giây ± 2.51% (60 lần lấy mẫu)

khớp 3,623,125 ops / giây ± 1,85% (62 lần lấy mẫu)

indexOf 6.230.325 ops / giây ± 0.95% (62 lần lấy mẫu)

phương thức kiểm tra nhanh hơn phương thức so khớp, nhưng phương pháp nhanh nhất là indexOf


indexOf không hoạt động với regexes nên không liên quan.
gdoron đang hỗ trợ Monica
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.