การหลีกเลี่ยงเครื่องหมายทับในนิพจน์ทั่วไป


107

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


1
คุณใช้ภาษาอะไร / การใช้นิพจน์ทั่วไป?
Gumbo

ที่น่าสนใจคือฉันกำลังมองหาคำถามนี้สำหรับ Javascript แต่แล้ว IDE ของฉันก็บอกว่าฉันใช้ทางหนีที่ไม่จำเป็น ดังนั้นจึงmyStr.replace(/[/:.-]+/gi, '_')ถูกต้องสำหรับความประหลาดใจของฉัน /[\/:.-]+/giผมคิดว่าผมจะต้อง ฉันไม่สามารถตัดสินใจได้ว่าสิ่งนี้เจ๋งหรือสับสน
Turbo

คำตอบ:


91

บริบท / ภาษาอะไร บางภาษาใช้/เป็นตัวคั่นรูปแบบใช่คุณต้องหลีกเลี่ยงโดยขึ้นอยู่กับภาษา / บริบท คุณสามารถหลีกเลี่ยงได้โดยใส่เครื่องหมายทับข้างหลัง: \/สำหรับบางภาษา (เช่น PHP) คุณสามารถใช้อักขระอื่นเป็นตัวคั่นได้ดังนั้นคุณจึงไม่จำเป็นต้องหลบหนี แต่ AFAIK ในทุกภาษาความสำคัญพิเศษเพียงอย่างเดียว/คือมันอาจเป็นตัวคั่นรูปแบบที่กำหนด


38

นี่คือตัวเลือกบางส่วน:

  • ใน Perl คุณสามารถเลือกตัวคั่นอื่นได้ m//คุณไม่ได้ถูกคุมขังใน คุณสามารถเลือกรายการอื่นเช่นm{}. แล้วการหนีก็ไม่จำเป็น ตามความเป็นจริง Damian Conway ใน "แนวทางปฏิบัติที่ดีที่สุดของ Perl" ยืนยันว่าm{}เป็นตัวคั่นทางเลือกเดียวที่ควรใช้และสิ่งนี้ได้รับการเสริมแรงโดย Perl :: Critic (บน CPAN) ในขณะที่คุณสามารถใช้อักขระตัวคั่นทางเลือกที่หลากหลาย//และ{}ดูเหมือนจะชัดเจนที่สุดในการถอดรหัสในภายหลัง อย่างไรก็ตามหากตัวเลือกใดตัวเลือกหนึ่งส่งผลให้เกิดการหลบหนีมากเกินไปให้เลือกตัวเลือกใดที่ให้ความชัดเจนมากที่สุด ร่วมเป็นตัวอย่างm(...), และm[...]m!...!

  • ในกรณีที่คุณไม่สามารถหรือไม่ต้องการใช้ตัวคั่นอื่นคุณสามารถหลีกเลี่ยงเครื่องหมายทับไปข้างหน้าด้วยแบ็กสแลช m/\/[^/]+$/ตัวอย่างเช่น (ใช้ตัวคั่นสำรองm{/[^/]+$}ซึ่งอาจอ่านได้ชัดเจนกว่า) หนีเฉือนด้วยเครื่องหมายทับขวาเป็นพอเรื่องธรรมดาที่จะได้รับชื่อและหน้าวิกิพีเดีย: เอนไม้จิ้มฟันซินโดรม ในนิพจน์ทั่วไปที่มีเพียงอินสแตนซ์เดียวการหลีกเลี่ยงเครื่องหมายทับอาจไม่เพิ่มขึ้นถึงระดับที่ถือว่าเป็นอุปสรรคต่อความชัดเจน แต่ถ้ามันเริ่มหลุดมือและถ้าภาษาของคุณอนุญาตให้ใช้ตัวคั่นอื่นเหมือนที่ Perl ทำนั่นจะ เป็นทางออกที่ต้องการ


1
คุณสามารถยกตัวอย่างได้หรือไม่? ฉันมีสิ่งนี้: perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confและฉันได้รับความขัดแย้งกับเครื่องหมายทับ
CMCDragonkai

โปรดทราบว่าคุณใช้sไม่ใช่mเมื่อทำการแทนที่ (aka แทน) ด้วยนิพจน์ทั่วไป perlfect.com/articles/regex.shtml
Mashmagar

2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf... แต่น่าจะดีกว่าperl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.confเพราะหลีกเลี่ยงการแก้ไขเชลล์
DavidO

1
อีกทางเลือกหนึ่งในการหลีกเลี่ยง/อักขระลิเทอรัลคือการใช้ฟังก์ชัน regex ในการระบุอักขระโดยการเข้ารหัส ASCII เป็นเลขฐานสิบหกหรือฐานแปด Perl ยอมรับรูปแบบฐานแปด\57(ที่มาregular-expressions.info/refcharacters.html )
lukeuser

ในหน้าที่ลิงก์โดย lukeuser (ขอบคุณ) ยังมี Escape Sequence \ Q ... \ E สิ่งนี้ได้ผลสำหรับฉัน
user3012857

11

ใช้แบ็กสแลช\หรือเลือกตัวคั่นอื่นเช่นm#.\d#แทน/.\d/ "ใน Perl คุณสามารถเปลี่ยนตัวคั่นนิพจน์ / ปกติเป็นอักขระพิเศษอื่น ๆ ได้เกือบทั้งหมดถ้าคุณนำหน้าด้วยตัวอักษร m (สำหรับการจับคู่)"




0

สำหรับ java คุณไม่จำเป็นต้องทำ

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

ถ้าคุณใส่ \ ข้างหน้า /. IDE จะบอกคุณ "Redundant Character Escape" \ / "ใน ReGex"

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