คำถามติดแท็ก regular-expression

นิพจน์ทั่วไป (มักเรียกสั้น ๆ ว่า "regex") เป็นนิพจน์ที่เขียนด้วยภาษาประกาศที่ใช้สำหรับรูปแบบการจับคู่ภายในสตริง

3
ค้นหาและแทนที่ด้วยนิพจน์ทั่วไป
ฉันมีไฟล์ที่มีค่าเริ่มต้นของผู้ใช้เป็นจำนวนมากฉันต้องการเปลี่ยนข้อความบางส่วน แต่ฉันกำลังต่อสู้กับผู้จับคู่และผู้แทนที่ ใช้ตัวอย่างต่อไปนี้: ############################################################################### # Trackpad, mouse, keyboard, Bluetooth accessories, and input # ############################################################################### # Trackpad: enable tap to click for this user and for the login screen defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true ฉันต้องการแทนที่# Trackpad: ...ด้วยrunning "Trackpad: ..." เมื่อหมดปัญหาฉันก็พบกับบางสิ่งที่ใช้เครื่องมือทดสอบ regex: /\n\n#\s(.*)/g ถ้าฉันลองและใช้สิ่งนี้เป็นกลุ่มมันไม่ได้ผลสำหรับฉัน: :/\n\n#\s(.*)/running "\1"/g ฉันเดาว่าปัญหาของฉันเดือดร้อนเหลือคำถามสองข้อ: ฉันจะหลีกเลี่ยงการค้นหา\nตัวอักษรและให้แน่ใจว่า#จะไม่ปรากฏในตอนท้ายของกลุ่มการค้นหา? ฉันจะใช้กลุ่มการดักจับได้อย่างมีประสิทธิภาพได้อย่างไร มีคำตอบที่ดีบางข้อด้านล่าง ยากที่จะเลือกระหว่างทั้งสาม …

2
เป็นไปได้ที่การค้นหาในระบบ regex ของกลุ่ม?
ฉันได้พบกับสถานการณ์หลายอย่างในกลุ่มที่มันจะมีประโยชน์ที่จะมีงบ lookaround ฉันได้พยายามใช้ LookAround ไวยากรณ์มาตรฐาน( (?=), (?!)ฯลฯ .. )แต่ปรากฏว่าเป็นกลุ่มไม่สนับสนุนเรื่องนี้ เป็นกลุ่มมีไวยากรณ์ที่เทียบเท่าสำหรับคำสั่งประเภทนี้?

3
วิธีการทำให้ regex matchers ไม่โลภ?
ฉันพยายามใช้ regex เพื่อแทนที่ข้อความในไฟล์ (แทนที่ URL แบบเต็มด้วยโปรโตคอล / โดเมน /): :%s/\(https\?:\/\/.*?\/\).*/\1/gc น่าเสียดายที่.*?ไม่ตรงกับสตริงแม้จะพยายามหลีกเลี่ยง?ปริมาณ ปริมาณที่ไม่โลภควรหนีในกลุ่มได้อย่างไร?

1
ฉันสามารถค้นหา Unicode ที่รวมอักขระใน Vim ได้หรือไม่
ฉันมีไฟล์ที่มีตัวอักษรã(ตัวพิมพ์เล็ก + รวมเครื่องหมายตัวหนอน) Encodingและมีทั้ง fileencoding แสดงให้เห็นว่าutf-8ga <a> 97, hex 61, octal 141 <~> 771, Hex 0303, Octal 1403 (แต่ด้วยการรวมเครื่องหมายตัวหนอนใน<>) และการg8แสดง 61 + cc 83 การค้นหาด้วย/a\%u0303ผลงานดี การค้นหาเพียงแค่\%u0303ให้รูปแบบ E486 ไม่พบ ฉันสามารถค้นหาเฉพาะอักขระที่รวมเข้าด้วยกันโดยไม่ต้องค้นหาอักขระพื้นฐานได้หรือไม่

5
รูปแบบไวยากรณ์เป็นกลุ่มเพื่อเน้นอาร์กิวเมนต์คำหลักหลาม
ฉันกำลังดิ้นรนกับการเรียนรู้กลุ่ม regexps (ฉันไม่รู้ regexp อื่น ๆ ได้เป็นอย่างดีเช่นกัน) ดังนั้นปัญหาหลักคือการกำหนด regexp ที่จะจับคู่ some_function_call(simple_value, keyword=value) คำสำคัญในตัวอย่างนี้ ดังนั้นควรจับคู่คำถ้ามันอยู่ใน parens และมีเครื่องหมายเท่ากับหลังจากนั้น ปัญหาต่อไปคือวิธีการกำหนดไฟล์ไวยากรณ์ในกลุ่ม ฉันจะซาบซึ้งในความช่วยเหลือ แต่ไม่ควรเรียนรู้อย่างหนักดังนั้นฉันสามารถทำได้ด้วยตัวเอง แก้ไขตามคำตอบฉันได้ทำความคุ้นเคยกับสคริปต์ไวยากรณ์ของตัวเองสำหรับหลาม รู้สึกอิสระที่จะลอง ป้อนคำอธิบายลิงก์ที่นี่

1
ทำไม Vim regex ไม่อนุญาตการจับมากกว่า 9 กลุ่ม
จาก:h E65นั้นเราจะเห็นว่า Vim ไม่อนุญาตให้มีกลุ่มการดักจับมากกว่า 9 กลุ่มในคำสั่งการแทนที่ ตัวอย่างเช่นคำสั่งต่อไปนี้จะทำงาน: s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)/\9\8\7\6\5\4\3\2\1 แต่อันนี้ที่มีกลุ่มการดักจับมากกว่าหนึ่งกลุ่มจะล้มเหลว: s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\10\9\8\7\6\5\4\3\2\1 คำถามของฉันไม่เกี่ยวกับสาเหตุที่มันล้มเหลว (มันเป็นขีด จำกัด ของ Vim) แต่ทำไม Vim ถึงมีขีด จำกัด นี้อยู่ด้วย? นอกจากนี้ฉันทราบว่า regex ชีวิตจริงที่มีกลุ่มดักจับมากกว่า 9 กลุ่มน่าจะเป็นเรื่องที่น่าประหลาดใจที่จะอ่านและดูแล แต่ฉันก็ยังสงสัยอยู่

1
เวทมนตร์ Regex ของ Vim เข้ากันได้กับคลาส Regex ที่รู้จักกันดีหรือไม่?
ไวยากรณ์นิพจน์ปกติของเครื่องมือ Unix จำนวนมากมักจะเป็น POSIX-codified Basic และ Extended Regular Expression (BRE และ ERE ตามลำดับ) และในการใช้งานที่ทันสมัยบางอย่างสไตล์ Perl (PCRE เป็นการนำไปใช้สิ่งนี้) มีการโต้ตอบแบบหนึ่งต่อหนึ่งระหว่างระดับเวทมนตร์ของ Vim และคลาสที่มีการกำหนดจากภายนอก แต่เป็นที่รู้จักกันดี? ดูเหมือนว่า\mเป็น BRE และ\vเป็น ERE ยกเว้น POSIX ไม่รวมการค้นหา หากมีการโต้ตอบดังกล่าวจะมีการกำหนดไว้ที่ไหน? มีเพียงหนึ่งเอ่ยถึงpattern.txtPOSIX หรือเราต้องใช้ "เวทมนต์" เพื่ออธิบายการแสดงออกปกติของกลุ่ม?

2
ฉันจะรันได้อย่างไร: แทนที่ส่วนใดส่วนหนึ่งของบรรทัดและไม่ได้ทั้งหมด
ฉันมีเส้นแบบนี้: function my_function(argument, another argument, but there are spaces) ฉันต้องการแทนที่อักขระช่องว่าง (ภายในชื่ออาร์กิวเมนต์) ด้วยเครื่องหมายขีดล่าง ฉันต้องการใช้: :s/\ /_/g แต่ฉันจะเลือกที่จะไม่ใช้กับทั้งบรรทัดได้อย่างไร แต่เริ่มจากพูดตำแหน่งเคอร์เซอร์ (หรือคำที่สาม)?

2
Regex ใน Vi: มีวิธีใช้คลาสอักขระภายในกลุ่มได้อย่างไร (เช่น [\ s \ w])
ใน Vim คลาสอักขระจะ\sตรงกับอักขระช่องว่างใด ๆ เมื่อฉันใช้ตัวอักษรพิเศษผู้ที่อยู่ในกลุ่มเช่น[\s\w]มันไม่ตรงกับช่องว่างเดียวหรือตัวอักษรคำก็ไม่ตรงหรือsw เราใช้คลาสตัวละครในกลุ่มได้อย่างไร

1
มีวิธีการแปลง VIM regex ให้เป็นโหมดเวทย์มนตร์ที่แตกต่างกันหรือไม่?
หากฉันมี Magic Vim regex ในสตริงตัวอักษรมีวิธีในการแปลง regex ทั้งหมดเป็นการนำเสนอทางเลือกที่ใช้โหมดมายากลที่แตกต่างกันดังนั้นฉันสามารถวาง regex ที่เทียบเท่าลงในซอร์สโค้ดได้หรือไม่ ตัวอย่างเช่นหากฉันต้องการแปลงรูปแบบโหมดเวทย์มนตร์นี้: '\m-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>' เป็นโหมดมายากลมากเพื่อให้อ่านง่ายขึ้นเช่น: '\v-=<\d+L=>|0[xX][0-9a-fA-F]+>' ฉันมักจะทำผิดพลาดพยายามแปลงด้วยมือ

4
เหตุผลสำหรับ \ r และ \ n หมายถึงสิ่งต่าง ๆ ในคำสั่ง s?
เราทุกคนรู้ว่าเมื่อค้นหา\nคือขึ้นบรรทัดใหม่และ\rเป็น carriage return ( ^M) แต่เมื่อแทนที่\rเป็นขึ้นบรรทัดใหม่ในขณะที่\nเป็นโมฆะ null ( ^@) ต้นกำเนิดของความไม่สมดุลนี้คืออะไร? ระบุว่าพฤติกรรมนี้เป็น ... แปลกประหลาดที่จะพูดน้อย (และค่อนข้างต่อต้านเมื่อคุณได้รับมันผิดครั้งแรก) ฉันคาดว่าจะมีเหตุผลทางประวัติศาสตร์ที่แปลกประหลาด (บังเอิญมีวิธี "แก้ไข" พฤติกรรมนี้และทำให้บางสิ่งบางอย่างง่ายขึ้นหรือไม่)

1
การพับตามรูปแบบการค้นหาของ regex
ฉันได้รับไฟล์ข้อความธรรมดาที่มีคอลัมน์ค่าช่องว่างคั่น แบบนี้: AU 3030 .... ... .... AU 3031 .... ... .... AU 3032 .... ... .... AU 3033 .... ... .... IT 48100 ... .. ..... IT 40100 ... .. ..... IT 48123 ... .. ..... UK 3333 ... ... ..... UK 4444 ... ... ..... UK 5555 ... …

1
กำลังลบช่วงของ n บรรทัดก่อนและหลังบรรทัดที่ตรงกันหรือไม่
ฉันมีไฟล์การกำหนดค่าซ้ำและฉันต้องการจับคู่ regex และลบช่วงของเส้นก่อนและหลังการแข่งขัน ฉันต้องการลบการจับคู่ในคำสั่งเดียว ฉันสามารถใช้... :g/match/-1d ... หลายครั้งที่จะลบมากกว่าหนึ่งบรรทัดจากก่อนการแข่งขัน ... ... และรวมเข้ากับการโทรสองสามครั้งเพื่อ ... :g/match/+1d ... เพื่อลบมากกว่าหนึ่งบรรทัดหลังการแข่งขัน ... แต่มีวิธีใดในการลบช่วงของเส้นก่อนหลังและรวมการจับคู่กับคำสั่งเดียว?

2
ละเว้น URL และที่อยู่อีเมลในไฟล์สะกด
มีวิธีที่จะเป็นกลุ่มไม่ได้ตั้งค่าสถานะ URL HTTP และที่อยู่อีเมลเป็นข้อผิดพลาดการสะกด? หรือโดยทั่วไปแล้ววิธีในการแสดงรายการ regexes ของการสะกดที่ถูกต้อง?

3
ความแตกต่างระหว่าง '\ zs' และ '\ @ <=' อะตอมใน Vim regex คืออะไร
นี่คือสิ่งที่ฉันได้รับจากเอกสาร: \zs"จะเริ่มต้นส่วนไฮไลต์" หลังจากจับคู่ regex ก่อนหน้าและ\@&lt;="จะเริ่มต้นเป็นส่วนหนึ่งที่ไฮไลต์" หลังจากจับคู่ก่อนหน้านี้อะตอม แต่ฉันไม่เข้าใจรายละเอียดปลีกย่อยของเรื่องนี้ดังนั้นทุกคนสามารถอธิบายได้ว่าพวกเขามีความลึกมากกว่านี้อย่างไร นี่คือสิ่งที่ทำให้ฉันอยากรู้: ถ้าฉันวิ่ง /\_s\zsnnoremap เช่นเลือกnnoremapนำหน้าด้วยช่องว่างหรือจุดเริ่มต้นของบรรทัด (เช่น newline จากบรรทัดก่อนหน้าดังนั้น\_ก่อนหน้านั้นs) จากนั้นเรียกใช้gnเพื่อเข้าสู่โหมดภาพและเลือกการแข่งขันนัดถัดไปด้วยเหตุผลบางประการเฉพาะคอลัมน์แรก (เช่น ครั้งแรกnในnnoremap) ถูกเลือก - แม้จะมีความจริงที่ว่าทั้งnnoremapคำที่ไฮไลต์ที่มีการ:hlsearchเปิด อย่างไรก็ตามถ้าฉันเรียกใช้การค้นหาแทน /\_s\@&lt;=nnoremap จากนั้นลองgnเลือกทั้งหมดnnoremapอย่างถูกต้อง เกิดอะไรขึ้นที่นี่? ฉัน (ฉันกล้าพูด) พบข้อบกพร่องที่คลุมเครือบ้างไหม

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