Kiểm tra xem một chuỗi có khớp với biểu thức chính quy trong JS không


751

Tôi muốn sử dụng JavaScript (có thể với jQuery) để thực hiện một số xác thực phía máy khách để kiểm tra xem một chuỗi có khớp với biểu thức chính quy hay không:

^([a-z0-9]{5,})$

Lý tưởng nhất sẽ là một biểu thức trả về đúng hoặc sai.

Tôi là người mới sử dụng JavaScript match() làm những gì tôi cần không? Nó dường như kiểm tra xem một phần của chuỗi có khớp với biểu thức chính quy không, không phải toàn bộ.


Bạn có muốn một kết hợp hoàn chỉnh, hoặc chỉ là liệu chuỗi có chứa một chuỗi con phù hợp không?
Kerrek SB

1
Một kết hợp hoàn chỉnh - không phải là một chuỗi con phù hợp.
Richard

Câu trả lời:


1196

Sử dụng regex.test()nếu tất cả những gì bạn muốn là kết quả boolean:

console.log(/^([a-z0-9]{5,})$/.test('abc1')); // false

console.log(/^([a-z0-9]{5,})$/.test('abc12')); // true

console.log(/^([a-z0-9]{5,})$/.test('abc123')); // true

... và bạn có thể xóa ()từ regrec của mình vì bạn không cần chụp.


1
^ Ban đầu trong regex có gì?
PedroD

8
@PedroD ^ ngụ ý bắt đầu hoặc bắt đầu với
Nagaraju

Vậy bạn sẽ làm ngược lại như thế nào? "không bắt đầu với ..."
PedroD


3
@stackdave có lẽ bạn đang làm việc với Java, chứ không phải JavaScript?
sfarbota

176

Sử dụng test()phương pháp:

var term = "sample1";
var re = new RegExp("^([a-z0-9]{5,})$");
if (re.test(term)) {
    console.log("Valid");
} else {
    console.log("Invalid");
}

3
Lưu ý rằng phiên bản RegExpcho phép đưa các giá trị biến vào chuỗi regex.
Barshe Roussy

2
đã phải xóa hai dấu ngoặc kép new RegExp("^([a-z0-9]{5,})$")để làm cho nó hoạt động
Facundo Colombiaier

98

Bạn cũng có thể sử dụng match():

if (str.match(/^([a-z0-9]{5,})$/)) {
    alert("match!");
}

Nhưng test()dường như nhanh hơn khi bạn có thể đọc ở đây .

Sự khác biệt quan trọng giữa match()test():

match()chỉ hoạt động với chuỗi, nhưng test()cũng hoạt động với số nguyên.

12345.match(/^([a-z0-9]{5,})$/); // ERROR
/^([a-z0-9]{5,})$/.test(12345);  // true
/^([a-z0-9]{5,})$/.test(null);   // false

// Better watch out for undefined values
/^([a-z0-9]{5,})$/.test(undefined); // true

Lý do nó hoạt động với một số là vì số đó bị ép buộc thành một chuỗi, bởi vì nó được đưa ra như một tham số khi nó mong đợi một chuỗi. Tôi sẽ không dựa vào hành vi này. Nó phụ thuộc vào việc thực hiện test () của môi trường của bạn. (trận đấu thất bại vì số không có matchthành viên). Tôi khuyên bạn nên chuyển đổi rõ ràng số của mình thành một chuỗi nếu bạn muốn sử dụng nó với regex ( String(123)ví dụ).
Bronzdragon

Trận đấu có thể được sử dụng ở đây, nhưng nếu bạn nhìn vào hiệu suất, sẽ testthực hiện tốt hơn 30% khi chúng tôi chỉ muốn xác thực một chuỗi để khớp với biểu thức chính quy và không trích xuất chuỗi con từ nó.
Akansh

@pmrotule Vâng, nhưng nó nên được đề cập trước khi mô tả trận đấu.
Akansh

Sự khác biệt đáng kể nhất giữa kiểm tra và kết hợp (và matchAll) là kết hợp đó thực hiện những điều muốn trả về danh sách tất cả các chuỗi con phù hợp, trong khi kiểm tra chỉ kiểm tra nếu có bất kỳ chuỗi nào. Kiểm tra các phương thức regex trong javascript.info/regEx-methods
Juan Lanus

50

Sử dụng /youregexp/.test(yourString)nếu bạn chỉ muốn biết liệu chuỗi của bạn có khớp với biểu thức chính quy không.


8

Đây là một ví dụ tìm kiếm các thẻ HTML nhất định để rõ ràng /someregex/.test()trả về giá trị boolean:

if(/(span|h[0-6]|li|a)/i.test("h3")) alert('true');

6
 let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 let regexp = /[a-d]/gi;
 console.log(str.match(regexp));

2

Bạn có thể thử điều này, nó làm việc cho tôi.

 <input type="text"  onchange="CheckValidAmount(this.value)" name="amount" required>

 <script type="text/javascript">
    function CheckValidAmount(amount) {          
       var a = /^(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/;
       if(amount.match(a)){
           alert("matches");
       }else{
        alert("does not match"); 
       }
    }
</script>

1

vui lòng thử hoa này:

/^[a-z0-9\_\.\-]{2,20}\@[a-z0-9\_\-]{2,20}\.[a-z]{2,9}$/.test('abc@abc.abc');

thật


1

thử

 /^[a-z\d]{5,}$/.test(str)


2
Câu trả lời chỉ có mã này mang lại giá trị gì cho trang?
mickmackusa

hiện tại nó là giải pháp ngắn nhất (do đơn giản hóa
regrec

1
Cạo 1 ký tự khỏi các mẫu được đăng cách đây nhiều năm. Ngáp
mickmackusa

2
Chỉ cần để lại một bình luận dưới một câu trả lời trước đó để nói rằng 0-9có thể giảm bớt aaaaaaaaaaaaaaaaaaaa cho đến khi xuống \d. Ồ, và rằng một nhóm bắt giữ là không cần thiết.
mickmackusa

1

Tôi sẽ khuyên bạn nên sử dụng phương thức thực thi trả về null nếu không có kết quả khớp nào nếu không nó trả về một đối tượng hữu ích.

let case1 = /^([a-z0-9]{5,})$/.exec("abc1");
console.log(case1); //null

let case2 = /^([a-z0-9]{5,})$/.exec("pass3434");
console.log(case2); // ['pass3434', 'pass3434', index:0, input:'pass3434', groups: undefined]

0
const regExpStr = "^([a-z0-9]{5,})$"
const result = new RegExp(regExpStr, 'g').test("Your string") // here I have used 'g' which means global search
console.log(result) // true if it matched, false if it doesn't
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.