นิพจน์ทั่วไปเพื่อแยกคำ / สตริง


298

ฉันมีการแสดงออกปกติดังนี้

^/[a-z0-9]+$

สิ่งนี้ตรงกับสตริงเช่น/helloหรือ/hello123หรือ

แต่ผมต้องการให้ยกเว้นคู่ของค่าสตริงเช่นและ/ignoreme/ignoreme2

ฉันได้ลองใช้งานบางรุ่น แต่ดูเหมือนจะใช้งานไม่ได้!

ความพยายามที่อ่อนแอครั้งล่าสุดของฉันคือ

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมสุดซึ้ง :-)


1
สำเนาซ้ำที่เป็นไปได้: stackoverflow.com/questions/1395177/…
Anderson Green

คำตอบ:


376

นี่เป็นอีกวิธีหนึ่ง (โดยใช้การมองหน้าเชิงลบ ):

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

หมายเหตุ: ([a-z0-9]+)มีเพียงหนึ่งการแสดงออกจับเป็น:


1
ยอดเยี่ยมที่ดูเหมือนว่าจะได้ทำเคล็ดลับ ฉันต้องการกฎนี้สำหรับการเขียน url ใหม่และฉันต้องการละเว้นโฟลเดอร์ "images", "css" และ "js" ดังนั้นกฎของฉันมีดังนี้: ^ / (?! css | js | images) ([az] +) /? (\? (. +.))? $ และจะเขียนใหม่เป็น /Profile.aspx?id=$1&$3 กฎนี้จะทำงานอย่างถูกต้องและเผยแพร่สตริงการสืบค้นด้วยหรือไม่ ดังนั้นหากมีคนเข้าชมmydomain.com/hello?abc=123ฉันต้องการให้เขียนไปที่mydomain.com/Profile.aspx?id=hello&abc=123 อีกครั้ง ฉันไม่แน่ใจเกี่ยวกับประสิทธิภาพของ (. +) ที่ จุดสิ้นสุดเพื่อดักจับการสอบถามในคำขอต้นฉบับ
romiem

ดูเหมือนว่านี่เป็นคำถามอื่น regexp ที่คุณดูเหมือนจะจับสตริงแบบสอบถาม - ทดสอบและดูว่าสตริงแบบสอบถามของคุณมาพร้อม นอกจากนี้ - (\?(.+))?$ควรรวดเร็ว ฉันไม่ต้องกังวลเรื่องความเร็วมากนัก
เซท

1
สิ่งนี้ไม่ได้ผลสำหรับฉันในขณะที่โซลูชันของ Alix Axel ทำงานได้ ฉันใช้java.util.regex.Patternคลาสของ Java
Mark Jeronimus

1
ฉันยืนยันการทำเครื่องหมายของ Mark;) - ตัวอย่างเช่น Pycharm เป็นภาษา Java หรือไม่ ดังนั้นเมื่อพิจารณาจาก regexes ในวิธีแก้ปัญหาของ Pycharm search Alix ก็ใช้งานไม่ได้
fanny

43

สิ่งนี้ควรทำ:

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3)

คุณสามารถเพิ่มคำที่ถูกละเว้นได้มากเท่าที่คุณต้องการนี่คือการติดตั้ง PHP อย่างง่าย:

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...');

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string);

ฉันคิดว่าการดูด้านหลังต้องใช้รูปแบบความกว้างคงที่หรือไม่
simon

2
@AlixAxel มันทำ แต่ libs regex ที่ชาญฉลาดจะอนุญาตให้มีการสลับกับความยาวที่แตกต่างกันสำหรับทางเลือก (และใช้ที่ยาวที่สุด) ตราบใดที่แต่ละทางเลือกนั้นมีความยาวคงที่
ChrisF

นี่คือสมาร์ท แต่ล้มเหลวสำหรับฉันถ้าคำที่ไม่สนใจอยู่ท้ายคำอื่น ๆ เช่นถ้าคุณเพิ่ม 'a' เป็นคำที่ไม่สนใจคำที่ลงท้ายด้วย a จะถูกละเว้น
singmotor

21

ตามที่คุณต้องการยกเว้นทั้งสองคำคุณต้องใช้การผสมผสาน:

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$

ขณะนี้เงื่อนไขทั้งสองต้องเป็นจริง (ไม่อนุญาตให้ใช้IgnoremeหรือIgnoreme2 ) ในการแข่งขัน


1
นี่เทียบเท่ากับตัวย่อที่สั้นกว่าข้างต้นซึ่งเป็นค่าลบเชิงซ้อนของชุดของทางเลือก
ChrisF

4
@ChrisF ไม่ไม่ได้จริงๆ วิธีการแก้ปัญหาของเซทจะไม่ตรงกับสิ่งที่ต้องการ/ignoremenotในขณะที่มีผู้ติดตาม/ ignoreme
Gumbo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.