ตรวจสอบว่าสตริงตรงกับ regex ใน JS


750

ฉันต้องการใช้ JavaScript (สามารถกับ jQuery) เพื่อทำการตรวจสอบฝั่งไคลเอ็นต์เพื่อตรวจสอบว่าสตริงตรงกับ regex หรือไม่:

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

เป็นการดีที่มันจะเป็นนิพจน์ที่ส่งกลับจริงหรือเท็จ

ฉันเป็นมือใหม่จาวาสคริปต์match()ทำในสิ่งที่ฉันต้องการ? ดูเหมือนว่าจะตรวจสอบว่าส่วนหนึ่งของสตริงตรงกับ regex ไม่ใช่สิ่งทั้งหมด


คุณต้องการจับคู่ที่สมบูรณ์หรือไม่ว่าสตริงมีสตริงย่อยที่ตรงกันหรือไม่
Kerrek SB

1
การจับคู่ที่สมบูรณ์ - ไม่ใช่สตริงย่อยที่ตรงกัน
Richard

คำตอบ:


1194

ใช้regex.test()หากสิ่งที่คุณต้องการคือผลลัพธ์แบบบูล:

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

... และคุณสามารถลบออก()จาก regexp ของคุณเนื่องจากคุณไม่จำเป็นต้องมีการจับภาพ


1
ค่าเริ่มต้น ^ ใน regex มีอะไรบ้าง
PedroD

8
@PedroD ^ หมายถึงการเริ่มหรือเริ่มต้นด้วย
Nagaraju

แล้วคุณจะทำสิ่งตรงกันข้ามอย่างไร "ไม่ได้ขึ้นต้นด้วย ... "
PedroD


3
@stackdave บางทีคุณอาจทำงานกับ Java แทนที่จะใช้ JavaScript?
sfarbota

176

ใช้test()วิธีการ:

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

3
โปรดทราบว่ารุ่นที่มีการRegExpอนุญาตให้ฉีดค่าตัวแปรลงในสตริง regex
Christophe Roussy

2
ต้องลบเครื่องหมายคำพูดคู่new RegExp("^([a-z0-9]{5,})$")เพื่อให้ทำงานได้
Facundo Colombier

98

คุณสามารถใช้match()เช่นกัน:

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

แต่test()ดูเหมือนว่าจะได้เร็วที่สุดเท่าที่คุณสามารถอ่านได้ที่นี่

ความแตกต่างที่สำคัญระหว่างmatch()และtest():

match()ใช้งานได้กับสตริงเท่านั้น แต่test()ใช้ได้กับจำนวนเต็มด้วย

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

เหตุผลที่ใช้งานได้กับตัวเลขนั้นเป็นเพราะจำนวนนั้นถูกรวมเข้ากับสตริงเพราะมันถูกกำหนดเป็นพารามิเตอร์เมื่อมันคาดว่าจะเป็นสตริง ฉันจะไม่พึ่งพาพฤติกรรมนี้ ขึ้นอยู่กับสภาพแวดล้อมในการทดสอบ () ของคุณ (การแข่งขันล้มเหลวเนื่องจากตัวเลขไม่มีmatchสมาชิก) ฉันขอแนะนำให้แปลงหมายเลขของคุณเป็นสตริงอย่างชัดเจนหากคุณต้องการใช้กับ regex ( String(123)เช่น)
Bronzdragon

การจับคู่สามารถใช้ที่นี่ แต่ถ้าคุณดูประสิทธิภาพให้testดีขึ้น 30% เมื่อเราต้องการตรวจสอบความถูกต้องของสตริงเพื่อจับคู่ regex และไม่ดึงสตริงย่อยออกจากมัน
Akansh

@ pmrotule ใช่ แต่มันควรจะกล่าวถึงก่อนคำอธิบายการแข่งขัน
Akansh

ความแตกต่างที่สำคัญที่สุดระหว่างการทดสอบและการจับคู่ (และ matchAll) คือการจับคู่นั้นทำสิ่งต่าง ๆ เพื่อส่งกลับรายการของสตริงย่อยที่ตรงกันทั้งหมดในขณะที่การทดสอบจะตรวจสอบเฉพาะถ้ามี ตรวจสอบวิธีการ regex ในjavascript.info/regexp-methods
Juan Lanus

50

ใช้/youregexp/.test(yourString)ถ้าคุณต้องการรู้ว่าสตริงของคุณตรงกับ regexp หรือไม่


8

นี่คือตัวอย่างที่มองหาแท็ก HTML บางอันดังนั้นจึงชัดเจนว่า/someregex/.test()จะส่งคืนบูลีน:

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


2

คุณสามารถลองมันใช้งานได้สำหรับฉัน

 <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

ลอง

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


2
คำตอบเฉพาะโค้ดนี้มีค่าอะไรใหม่นำมาสู่หน้า?
mickmackusa

ปัจจุบันมันเป็นทางออกที่สั้นที่สุด (เนื่องจากการทำให้เข้าใจง่าย regexp)
Kamil Kiełczewski

1
โพสต์เมื่อหลายปีก่อนมีลักษณะของการโกน 1 ตัวอักษร อ้าปากค้าง
mickmackusa

2
เพียงแค่แสดงความคิดเห็นภายใต้คำตอบก่อนหน้านี้ไปยังรัฐ0-9สามารถลด aaaaaaaaaaaaaaaaaaaaall \dลงวิธีการ โอ้และกลุ่มจับไม่จำเป็น
mickmackusa

1

ฉันอยากจะแนะนำให้ใช้วิธีการดำเนินการซึ่งจะส่งกลับ null ถ้าไม่มีการแข่งขันอยู่มิฉะนั้นจะส่งคืนวัตถุที่เป็นประโยชน์

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.