ฉันจะเขียน regex เพื่อจับคู่สตริงที่ไม่ตรงกับรูปแบบเฉพาะได้อย่างไร ฉันต้องเผชิญกับสถานการณ์ที่ต้องจับคู่รูปแบบ (A และ ~ B)
ฉันจะเขียน regex เพื่อจับคู่สตริงที่ไม่ตรงกับรูปแบบเฉพาะได้อย่างไร ฉันต้องเผชิญกับสถานการณ์ที่ต้องจับคู่รูปแบบ (A และ ~ B)
คำตอบ:
คุณสามารถใช้การยืนยันล่วงหน้า:
(?!999)\d{3}
999
ตัวอย่างนี้ตรงกับตัวเลขสามหลักอื่นที่ไม่ใช่
แต่ถ้าคุณไม่ได้ใช้นิพจน์ทั่วไปกับคุณสมบัตินี้ (ดูการเปรียบเทียบของ Expression Flavours ) คุณอาจต้องสร้างนิพจน์ทั่วไปด้วยคุณสมบัติพื้นฐานด้วยตัวคุณเอง
นิพจน์ปกติที่เข้ากันได้กับไวยากรณ์พื้นฐานเท่านั้นจะเป็น:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
นี้ไม่ตรงกับลำดับตัวเลขใด ๆ 999
ที่สามที่ไม่ได้เป็น
หากคุณต้องการจับคู่คำในสตริงและไม่ให้ตรงกับคำ B ตัวอย่างเช่น: หากคุณมีข้อความ:
1. I have a two pets - dog and a cat
2. I have a pet - dog
หากคุณต้องการค้นหาบรรทัดข้อความที่มีสุนัขเป็นสัตว์เลี้ยงและไม่มีแมวคุณสามารถใช้นิพจน์ทั่วไปนี้ได้:
^(?=.*?\bdog\b)((?!cat).)*$
มันจะหาบรรทัดที่สองเท่านั้น:
2. I have a pet - dog
findstr
คำสั่งDOS มันเป็นเพียงส่วนย่อย ๆ ของความสามารถที่คุณคาดว่าจะพบในเครื่องมือ regex lookahead ไม่ได้อยู่ในหมู่พวกเขา (ฉันเพิ่งเพิ่มแท็กfindstr ด้วยตัวเอง)
จับคู่กับรูปแบบและใช้ภาษาโฮสต์เพื่อกลับผลลัพธ์บูลีนของการจับคู่ นี้จะชัดเจนมากขึ้นและบำรุงรักษาได้
โปรดอย่ารื้อฟื้นคำถามโบราณนี้อีกครั้งเพราะมีวิธีแก้ปัญหาง่ายๆที่ไม่ได้กล่าวถึง (พบคำถามของคุณในขณะทำการค้นคว้าเพื่อค้นหาค่าหัว regex )
ฉันต้องเผชิญกับสถานการณ์ที่ต้องจับคู่รูปแบบ (A และ ~ B)
regex ขั้นพื้นฐานสำหรับเรื่องนี้เป็นเรื่องง่ายที่น่ากลัว: B|(A)
คุณเพียงแค่ไม่สนใจการจับคู่โดยรวมและตรวจสอบการจับกลุ่มที่ 1 ซึ่งจะมี A
ตัวอย่าง (ที่มีข้อจำกัดความรับผิดชอบทั้งหมดเกี่ยวกับการแยกวิเคราะห์ html ใน regex): A คือดิจิต, B คือดิจิตัลภายใน <a tag
Regex: <a.*?<\/a>|(\d+)
การสาธิต (ดูที่กลุ่ม 1 ในบานหน้าต่างด้านขวาล่าง)
การอ้างอิง
\d
การอ้างอิงแรกกล่าวถึงเฉพาะกับ Perl และ PHP: "มีรูปแบบการใช้ไวยากรณ์เฉพาะกับ Perl และ PHP ที่ทำได้เหมือนกัน" [[:digit:]]
ความสมบูรณ์ของภาษาปกติก็เป็นภาษาปกติเช่นกัน แต่ในการสร้างคุณต้องสร้างDFAสำหรับภาษาปกติและทำการเปลี่ยนแปลงสถานะที่ถูกต้องให้เป็นข้อผิดพลาด ดูนี้เป็นตัวอย่าง สิ่งที่หน้าไม่ได้พูดก็คือว่ามันแปลงลงใน/(ac|bd)/
/(a[^c]?|b[^d]?|[^ab])/
การแปลงจาก DFA กลับเป็นนิพจน์ทั่วไปนั้นไม่สำคัญ จะง่ายกว่าถ้าคุณสามารถใช้นิพจน์ทั่วไปที่ไม่เปลี่ยนแปลงและเปลี่ยนซีแมนทิกส์ในรหัสได้ตามที่แนะนำไว้ก่อนหน้านี้
replace
str.replace(/re/g, '')
แล้วไม่จำเป็นต้องเข้าร่วมอีกครั้ง ถ้าคุณขว้างท้าย \ s อย่างนั้นล่ะ? เช่นstr.replace(/\re\s?/g, '')
นั้นคุณจะกำจัดช่องว่างที่ซ้ำซ้อนที่คุณจะได้รับจากสิ่งที่ถูกแทนที่กลางสตริง
คำตอบของฉันที่นี่อาจช่วยแก้ปัญหาของคุณได้เช่นกัน:
https://stackoverflow.com/a/27967674/543814
$1
$2
$2
ถูกจับที่นั่นซึ่งคุณจะหลีกเลี่ยงตัวอย่าง:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
กลุ่มการจับภาพแรกระบุรูปแบบที่คุณต้องการหลีกเลี่ยง กลุ่มการจับภาพล่าสุดจับทุกอย่างอื่น เพียงแค่อ่านกลุ่ม$2
นั้น
(B)|(A)
จากนั้นใช้สิ่งที่จับกลุ่ม 2 ...
findstr
แท็กเนื่องจากคำตอบทั้งหมดที่นี่ไม่ถูกต้องสำหรับแท็ก