ฉันจะสร้างนิพจน์ทั่วไปเพื่อจับคู่คำที่จุดเริ่มต้นของสตริงได้อย่างไร เรากำลังมองหาการจับคู่stop
ที่จุดเริ่มต้นของสตริงและทุกอย่างสามารถติดตามได้
ตัวอย่างเช่นนิพจน์ควรตรงกัน:
stop
stop random
stopping
ขอบคุณ.
ฉันจะสร้างนิพจน์ทั่วไปเพื่อจับคู่คำที่จุดเริ่มต้นของสตริงได้อย่างไร เรากำลังมองหาการจับคู่stop
ที่จุดเริ่มต้นของสตริงและทุกอย่างสามารถติดตามได้
ตัวอย่างเช่นนิพจน์ควรตรงกัน:
stop
stop random
stopping
ขอบคุณ.
คำตอบ:
หากคุณต้องการจับคู่เฉพาะบรรทัดที่ขึ้นต้นด้วยหยุดใช้
^stop
หากคุณต้องการจับคู่บรรทัดที่ขึ้นต้นด้วยคำว่าหยุดตามด้วยช่องว่าง
^stop\s
หรือหากคุณต้องการจับคู่บรรทัดที่ขึ้นต้นด้วยคำหยุด แต่ตามด้วยช่องว่างหรืออักขระอื่น ๆ ที่ไม่ใช่คำที่คุณสามารถใช้ได้ (อนุญาตให้ใช้รสชาตินิพจน์ทั่วไปของคุณได้)
^stop\W
ในทางกลับกันสิ่งที่ตามมาจะตรงกับคำที่จุดเริ่มต้นของสตริงในรสชาติ regex ส่วนใหญ่ (ในรสชาติเหล่านี้ \ w จะตรงข้ามกับ \ W)
^\w
หากรสชาติของคุณไม่มีทางลัด \ w คุณสามารถใช้
^[a-zA-Z0-9]+
โปรดระวังว่าสำนวนที่สองนี้จะจับคู่เฉพาะตัวอักษรและตัวเลขเท่านั้นไม่มีสัญลักษณ์ใด ๆ
ตรวจสอบคู่มือรสชาติ regex ของคุณเพื่อดูว่าทางลัดใดที่อนุญาตและตรงกับสิ่งที่ตรงกัน (และวิธีจัดการกับ Unicode)
^stop\b
ซึ่งจะอนุญาตให้มีขอบเขตใด ๆ รวมถึงจุดสิ้นสุดของบรรทัดด้วย
ลองสิ่งนี้:
/^stop.*$/
คำอธิบาย:
หากคุณต้องการบังคับให้หยุดนั้นตามด้วยช่องว่างคุณสามารถแก้ไข RegEx ได้ดังนี้:
/^stop\s+.*$/
หมายเหตุ: โปรดทราบว่า RegEx ข้างต้นกำหนดให้คำหยุดตามด้วยช่องว่าง! ดังนั้นมันจะไม่ตรงกับบรรทัดที่มีเพียง: stop
หากคุณต้องการจับคู่สิ่งใด ๆ หลังจากคำหยุดไม่เพียง แต่ที่จุดเริ่มต้นของบรรทัดคุณสามารถใช้: \bstop.*\b
- คำตามด้วยบรรทัด
หรือถ้าคุณต้องการจับคู่คำในสตริงให้ใช้\bstop[a-zA-Z]*
- เฉพาะคำที่ขึ้นต้นด้วยหยุด
หรือจุดเริ่มต้นของบรรทัดโดยหยุด^stop[a-zA-Z]*
สำหรับคำเท่านั้น - คำแรกเท่านั้น
ทั้งบรรทัด^stop.*
- บรรทัดแรกของสตริงเท่านั้น
และถ้าคุณต้องการจับคู่ทุกสตริงที่เริ่มต้นด้วยหยุดรวมถึงขึ้นบรรทัดใหม่ให้ใช้: /^stop.*/s
- สตริงหลายบรรทัดเริ่มต้นด้วยหยุด
เหมือนที่ @SharadHolani กล่าว คำนี้จะไม่ตรงกับทุกคำที่ขึ้นต้นด้วย " หยุด "
. เฉพาะในกรณีที่อยู่ต้นบรรทัดเช่น " หยุดไป " @Waxo ให้คำตอบที่ถูกต้อง:
หนึ่งนี้เป็นเล็กน้อยดีกว่าถ้าคุณต้องการเพื่อให้ตรงกับคำใด ๆ เริ่มต้นด้วยการ " หยุด " และมีอะไร แต่ตัวอักษรจากA ถึง Z
\bstop[a-zA-Z]*\b
สิ่งนี้จะตรงกับทั้งหมด
หยุด (1)
หยุดสุ่ม (2)
หยุด (3)
ต้องการหยุด (4)
ได้โปรดหยุด (5)
แต่
/^stop[a-zA-Z]*/
จะจับคู่เฉพาะ (1) ถึง (3) แต่ไม่ใช่ (4) & (5)
/stop([a-zA-Z])+/
จะตรงกับคำหยุดใด ๆ (หยุดหยุดหยุดหยุด ฯลฯ )
อย่างไรก็ตามหากคุณต้องการจับคู่ "หยุด" ที่จุดเริ่มต้นของสตริง
/^stop/
จะทำ: D
หากคุณต้องการจับคู่สิ่งที่ขึ้นต้นด้วย "หยุด" รวมถึง "หยุดไป" "หยุด" และ "หยุด" ให้ใช้:
^stop
หากคุณต้องการจับคู่คำว่าหยุดตามด้วยอะไรก็ได้เช่น "หยุดไป" "หยุดสิ่งนี้" แต่ไม่ใช่ "หยุด" และไม่ "หยุด" ให้ใช้:
^stop\W
ฉันขอแนะนำให้ไม่ใช้วิธีการแสดงออกที่เรียบง่ายสำหรับปัญหานี้ มีคำที่เป็นสตริงย่อยของคำอื่น ๆ ที่ไม่เกี่ยวข้องมากเกินไปและคุณอาจจะรู้สึกบ้าคลั่งที่พยายามจะใช้วิธีแก้ปัญหาที่ง่ายกว่านั้นมากเกินไป
คุณจะต้องใช้อัลกอริธึมการสะกดคำที่ไร้เดียงสาเป็นอย่างน้อย (ลองใช้ Porter stemmer มีโค้ดฟรีในภาษาส่วนใหญ่) เพื่อประมวลผลข้อความก่อน เก็บข้อความที่ผ่านการประมวลผลนี้และข้อความก่อนการประมวลผลไว้ในอาร์เรย์แบบแบ่งช่องว่างสองอาร์เรย์ ตรวจสอบให้แน่ใจว่าอักขระที่ไม่เรียงตามตัวอักษรแต่ละตัวได้รับดัชนีของตัวเองในอาร์เรย์นี้ด้วย ไม่ว่าคุณจะกรองรายการคำใดก็ตามให้ใช้คำเหล่านั้นด้วย
ขั้นตอนต่อไปคือการค้นหาดัชนีอาร์เรย์ที่ตรงกับรายการคำ 'หยุด' ของคุณ ลบสิ่งเหล่านั้นออกจากอาร์เรย์ที่ยังไม่ได้ประมวลผลแล้วเข้าร่วมอีกครั้งบนช่องว่าง
สิ่งนี้ซับซ้อนกว่าเล็กน้อย แต่จะเป็นแนวทางที่น่าเชื่อถือกว่ามาก หากคุณมีข้อสงสัยใด ๆ เกี่ยวกับคุณค่าของวิธี NLP ที่มุ่งเน้นมากขึ้นคุณอาจต้องการที่จะทำวิจัยบางอย่างเป็นความผิดพลาด clbuttic
หากคุณต้องการให้คำขึ้นต้นด้วย "หยุด" คุณสามารถใช้รูปแบบต่อไปนี้ "^ หยุด *"
สิ่งนี้จะจับคู่คำที่ขึ้นต้นด้วยหยุดตามด้วยอะไรก็ได้
"^stop"
?
code
String line = "stopped";
String pattern = "^stop";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(line);
System.out.println(m.find( )); //prints true
System.out.println(line.matches(pattern)); //prints false