ค้นหาและแทนที่กลุ่มการดักจับภายในไฟล์


0

ฉันกำลังพยายามอ่านไฟล์ข้อความไม่สำคัญว่าจะใช้ภาษาใด ...

$x = [IO.File]::ReadAllText("__init__.py")

... ค้นหาสตริง

$pattern = [regex] '(?s)(?:ExportSTL.+?global_scale = .+?default=)(.+?),'

... และแทนที่กลุ่มการจับภาพ ( (.+?)) ด้วยสตริงอื่น (ตัวอย่าง10.0) จากนั้นเขียนไฟล์และปิด

ฉันจะไปที่กลุ่มการจับภาพในวิธีที่ฉันสามารถแก้ไขได้และบันทึกไฟล์ได้อย่างไร ความพยายามทั้งหมดของฉันแทนที่กลุ่มที่ตรงกันทั้งหมดด้วยกลุ่มที่ไม่จับภาพ


โปรดอ่านฉันจะตอบคำถามของฉันเองได้ไหม? และอย่าตอบคำถาม
DavidPostill

คำตอบ:


1

ลองใช้กลุ่ม lookbehind เชิงบวกแทนกลุ่มที่ไม่ได้จับภาพ:

$pattern = [regex] '(?s)(?<=ExportSTL.+?global_scale = .+?default=)(.+?),'

กลุ่ม lookbehind จะต้องจับคู่ แต่จะไม่ใช้อักขระใด ๆ

'10.0'สตริงทดแทนจะเป็นเพียง

วิธีที่แปลกใหม่น้อยกว่าคือเปลี่ยนกลุ่มที่ไม่ถูกจับเป็นกลุ่มปกติ:

$pattern = [regex] '(?s)(ExportSTL.+?global_scale = .+?default=)(.+?),'

สตริงการแทนที่จะเป็น'${1}10.0'(ด้วยเครื่องหมายคำพูดเดี่ยว) ${1}หมายถึงกลุ่มแรก (คุณต้องการวงเล็บปีกกาที่มีเครื่องหมาย "1" เพื่อไม่ให้เป็น "10.0")


lookbehind บวกไม่ได้ทำงานที่นี่ - Lookbehinds ต้องเป็นศูนย์ที่มีความกว้างจึงปริมาณไม่ได้รับอนุญาต วงเล็บปีกกา${1}ทำงานนี่คือสิ่งที่ฉันหายไป
Leeroy

@ Leeroy ฉันเชื่อว่า lookbehinds สามารถมีความกว้างของตัวแปรใน PowerShell และ. NET เป็นความจริงที่ว่าพวกเขาจะต้องมีความกว้างคงที่ในบางรสชาติของ regex เช่นใน Boost (C ++)
dangph

โอ้ขอโทษฉันเห็นว่าคุณพูดถูกสนับสนุนความกว้างของตัวแปรมองหา ฉันจะได้รับการจับคู่กับ regex ของคุณและ1 --- 1.0 0 --- 1.0,ฉันไม่สามารถนำมันมาทดแทนได้อย่างถูกต้อง -replace $pattern, '10.0'เปลี่ยนอินสแตนซ์ทั้งหมดของdefault=somethingแทนที่จะเป็นแบบนั้นด้วย1.0
Leeroy

@ Leeroy นี่คือตัวอย่าง ลองใช้งาน'123abc' -replace '(?<=123)(abc)','xxx' มัน: แทนที่ "abc" ด้วย "xxx" หากคุณเปลี่ยน "123" ในสตริงเดิมการแทนที่จะไม่เกิดขึ้น ( แต่ในกรณีใด ๆ ผมคิดว่าวิธีที่สองกับ$1การเปลี่ยนน่าจะดีกว่าเพราะผู้คนมากขึ้นจะเข้าใจมัน.)
dangph

0

วิธีการแก้

ขอบคุณ@dangphนี่คือสคริปต์ที่มีข้อเสนอแนะของเขาวางไว้

$x = [IO.File]::ReadAllText("__init__.py")
# Turned the non-capturing group into a normal group
$pattern = [regex] '(?s)(ExportSTL.+?global_scale = .+?default=)(.+?),'
# Put $1 in curly brackets, and added literal comma at end of replacement
$x -replace $pattern, '${1}10.0,' | Set-Content .\__init__.py

อัปเดต Regex101

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