นิพจน์ทั่วไปเพื่อจับคู่สตริงที่ขึ้นต้นด้วย "หยุด"


102

ฉันจะสร้างนิพจน์ทั่วไปเพื่อจับคู่คำที่จุดเริ่มต้นของสตริงได้อย่างไร เรากำลังมองหาการจับคู่stopที่จุดเริ่มต้นของสตริงและทุกอย่างสามารถติดตามได้

ตัวอย่างเช่นนิพจน์ควรตรงกัน:

stop
stop random
stopping

ขอบคุณ.

คำตอบ:


191

หากคุณต้องการจับคู่เฉพาะบรรทัดที่ขึ้นต้นด้วยหยุดใช้

^stop

หากคุณต้องการจับคู่บรรทัดที่ขึ้นต้นด้วยคำว่าหยุดตามด้วยช่องว่าง

^stop\s

หรือหากคุณต้องการจับคู่บรรทัดที่ขึ้นต้นด้วยคำหยุด แต่ตามด้วยช่องว่างหรืออักขระอื่น ๆ ที่ไม่ใช่คำที่คุณสามารถใช้ได้ (อนุญาตให้ใช้รสชาตินิพจน์ทั่วไปของคุณได้)

^stop\W

ในทางกลับกันสิ่งที่ตามมาจะตรงกับคำที่จุดเริ่มต้นของสตริงในรสชาติ regex ส่วนใหญ่ (ในรสชาติเหล่านี้ \ w จะตรงข้ามกับ \ W)

^\w

หากรสชาติของคุณไม่มีทางลัด \ w คุณสามารถใช้

^[a-zA-Z0-9]+

โปรดระวังว่าสำนวนที่สองนี้จะจับคู่เฉพาะตัวอักษรและตัวเลขเท่านั้นไม่มีสัญลักษณ์ใด ๆ

ตรวจสอบคู่มือรสชาติ regex ของคุณเพื่อดูว่าทางลัดใดที่อนุญาตและตรงกับสิ่งที่ตรงกัน (และวิธีจัดการกับ Unicode)


28
+1 เพื่อสรุปคำตอบของคุณ ฉันชอบที่จะเห็นสิ่งนี้มากขึ้นใน Stack Overflow ทำให้เป็นแหล่งเรียนรู้ที่ดีกว่าในความคิดของฉัน
จิม

จะทำให้มันตรงตามตัวพิมพ์เล็กหรือใหญ่ได้อย่างไรเช่นจับคู่ Stop หรือ stop หรือ sTop?
Elton Garcia de Santana

ขึ้นอยู่กับภาษาของคุณ ... รองรับ Perl สามารถใช้ตัวปรับแต่ง I / regex / i .NET RegexOptions.IgnoreCase และอื่น ๆ
Vinko Vrsalovic

อย่าลืม^stop\bซึ่งจะอนุญาตให้มีขอบเขตใด ๆ รวมถึงจุดสิ้นสุดของบรรทัดด้วย
Mad Physicist

81

ลองสิ่งนี้:

/^stop.*$/

คำอธิบาย:

  • / charachters คั่นระหว่างนิพจน์ทั่วไป (กล่าวคือไม่ได้เป็นส่วนหนึ่งของ Regex per se)
  • ^หมายถึงการจับคู่ที่จุดเริ่มต้นของบรรทัด
  • . ตามด้วย*หมายถึงจับคู่อักขระใด ๆ (.) จำนวนครั้งใดก็ได้ (*)
  • $หมายถึงจุดสิ้นสุดของบรรทัด

หากคุณต้องการบังคับให้หยุดนั้นตามด้วยช่องว่างคุณสามารถแก้ไข RegEx ได้ดังนี้:

/^stop\s+.*$/
  • \ sหมายถึงอักขระเว้นวรรคใด ๆ
  • +ต่อไป\ sหมายถึงจะต้องมีตัวละครช่องว่างอย่างน้อยหนึ่งต่อไปนี้หลังจากคำหยุด

หมายเหตุ: โปรดทราบว่า RegEx ข้างต้นกำหนดให้คำหยุดตามด้วยช่องว่าง! ดังนั้นมันจะไม่ตรงกับบรรทัดที่มีเพียง: stop


ไม่ใช่ทุกภาษาที่ใช้แฟลชข้างหน้าเพื่อคั่น regexes
JAB

1
@Cat Megex: ซึ่งเป็นเหตุผลว่าทำไมฉันจึงเพิ่มคำอธิบาย หากภาษาของคุณใช้อย่างอื่นเพื่อคั่น regex ให้แทนที่ / ด้วยอักขระที่เหมาะสม
Mike Dinescu

1
@Mez ใช่และความซ้ำซ้อนดังกล่าวเพิ่มทั้งความชัดเจนและประสิทธิภาพrexegg.com/regex-optimizations.html#anchors
MarredCheese

31

หากคุณต้องการจับคู่สิ่งใด ๆ หลังจากคำหยุดไม่เพียง แต่ที่จุดเริ่มต้นของบรรทัดคุณสามารถใช้: \bstop.*\b- คำตามด้วยบรรทัด

Word จนจบสตริง

หรือถ้าคุณต้องการจับคู่คำในสตริงให้ใช้\bstop[a-zA-Z]*- เฉพาะคำที่ขึ้นต้นด้วยหยุด

เฉพาะคำที่ขึ้นต้นด้วยหยุด

หรือจุดเริ่มต้นของบรรทัดโดยหยุด^stop[a-zA-Z]*สำหรับคำเท่านั้น - คำแรกเท่านั้น
ทั้งบรรทัด^stop.*- บรรทัดแรกของสตริงเท่านั้น

และถ้าคุณต้องการจับคู่ทุกสตริงที่เริ่มต้นด้วยหยุดรวมถึงขึ้นบรรทัดใหม่ให้ใช้: /^stop.*/s- สตริงหลายบรรทัดเริ่มต้นด้วยหยุด


20

เหมือนที่ @SharadHolani กล่าว คำนี้จะไม่ตรงกับทุกคำที่ขึ้นต้นด้วย " หยุด "

. เฉพาะในกรณีที่อยู่ต้นบรรทัดเช่น " หยุดไป " @Waxo ให้คำตอบที่ถูกต้อง:

หนึ่งนี้เป็นเล็กน้อยดีกว่าถ้าคุณต้องการเพื่อให้ตรงกับคำใด ๆ เริ่มต้นด้วยการ " หยุด " และมีอะไร แต่ตัวอักษรจากA ถึง Z

\bstop[a-zA-Z]*\b

สิ่งนี้จะตรงกับทั้งหมด

หยุด (1)

หยุดสุ่ม (2)

หยุด (3)

ต้องการหยุด (4)

ได้โปรดหยุด (5)

แต่

/^stop[a-zA-Z]*/

จะจับคู่เฉพาะ (1) ถึง (3) แต่ไม่ใช่ (4) & (5)


8
/stop([a-zA-Z])+/

จะตรงกับคำหยุดใด ๆ (หยุดหยุดหยุดหยุด ฯลฯ )

อย่างไรก็ตามหากคุณต้องการจับคู่ "หยุด" ที่จุดเริ่มต้นของสตริง

/^stop/

จะทำ: D


2
จะตรงกับ "ไม่หยุด"
Alex B

1
สิ่งนี้จะไม่ตรงกับ stop123 หรือหยุด
lostintranslation

7

หากคุณต้องการจับคู่สิ่งที่ขึ้นต้นด้วย "หยุด" รวมถึง "หยุดไป" "หยุด" และ "หยุด" ให้ใช้:

^stop

หากคุณต้องการจับคู่คำว่าหยุดตามด้วยอะไรก็ได้เช่น "หยุดไป" "หยุดสิ่งนี้" แต่ไม่ใช่ "หยุด" และไม่ "หยุด" ให้ใช้:

^stop\W

0

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

คุณจะต้องใช้อัลกอริธึมการสะกดคำที่ไร้เดียงสาเป็นอย่างน้อย (ลองใช้ Porter stemmer มีโค้ดฟรีในภาษาส่วนใหญ่) เพื่อประมวลผลข้อความก่อน เก็บข้อความที่ผ่านการประมวลผลนี้และข้อความก่อนการประมวลผลไว้ในอาร์เรย์แบบแบ่งช่องว่างสองอาร์เรย์ ตรวจสอบให้แน่ใจว่าอักขระที่ไม่เรียงตามตัวอักษรแต่ละตัวได้รับดัชนีของตัวเองในอาร์เรย์นี้ด้วย ไม่ว่าคุณจะกรองรายการคำใดก็ตามให้ใช้คำเหล่านั้นด้วย

ขั้นตอนต่อไปคือการค้นหาดัชนีอาร์เรย์ที่ตรงกับรายการคำ 'หยุด' ของคุณ ลบสิ่งเหล่านั้นออกจากอาร์เรย์ที่ยังไม่ได้ประมวลผลแล้วเข้าร่วมอีกครั้งบนช่องว่าง

สิ่งนี้ซับซ้อนกว่าเล็กน้อย แต่จะเป็นแนวทางที่น่าเชื่อถือกว่ามาก หากคุณมีข้อสงสัยใด ๆ เกี่ยวกับคุณค่าของวิธี NLP ที่มุ่งเน้นมากขึ้นคุณอาจต้องการที่จะทำวิจัยบางอย่างเป็นความผิดพลาด clbuttic


0

หากคุณต้องการให้คำขึ้นต้นด้วย "หยุด" คุณสามารถใช้รูปแบบต่อไปนี้ "^ หยุด *"

สิ่งนี้จะจับคู่คำที่ขึ้นต้นด้วยหยุดตามด้วยอะไรก็ได้


1
คุณไม่เพียงแค่ใช้"^stop"?
Stephen Rauch

มันขึ้นอยู่กับ. ในขณะที่พูดถึงไวยากรณ์ java เราสามารถใช้ Pattern และ Matcher object สำหรับการใช้ regex หรือ direct use .matches () method กับ String object ผลลัพธ์ต่างกันดังนี้ 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
Manisha Chaurasia

1
สิ่งนี้จะจับคู่เฉพาะในกรณีที่คำที่อยู่ต้นบรรทัด หากคำที่ขึ้นต้นด้วย "หยุด" อยู่ตรงกลางบรรทัดหรือตอนท้าย regex นี้จะไม่ตรงกัน @StephenRauch ถ้าคุณไม่ใส่ [az] * คุณจะไม่ได้รับคำเช่น "หยุด" ทั้งหมด ในกรณีของ "หยุด" คุณจะได้รับ "stop" และ "ping" จะหายไป
Sedat Kilinc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.