Tìm và thay thế nhóm chụp trong tập tin


0

Tôi đang cố đọc một tệp văn bản, không quan trọng bằng ngôn ngữ nào ...

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

... tìm một chuỗi

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

... và thay thế nhóm bắt giữ ( (.+?) ) với một chuỗi khác (ví dụ: 10.0 ). Sau đó viết vào tập tin và đóng nó.

Làm thế nào tôi có thể nhận được tại nhóm chụp theo cách mà tôi có thể sửa đổi nó tại chỗ và lưu tệp? Tất cả các nỗ lực của tôi thay thế toàn bộ dòng phù hợp, với nhóm không bắt giữ.


Xin vui lòng đọc Tôi có thể trả lời câu hỏi của riêng tôi không? và không trả lời trong câu hỏi.
DavidPostill

Câu trả lời:


1

Hãy thử một nhóm nhìn tích cực thay vì nhóm không bắt giữ:

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

Nhóm lookbehind sẽ được yêu cầu khớp, nhưng nó sẽ không tiêu thụ bất kỳ ký tự nào.

Chuỗi thay thế sẽ chỉ là '10.0'.

Một cách ít kỳ lạ hơn là biến nhóm không bắt giữ thành một nhóm bình thường:

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

Chuỗi thay thế sẽ là '${1}10.0' (có dấu ngoặc đơn). Các ${1} đại diện cho nhóm đầu tiên. (Bạn cần dấu ngoặc nhọn quanh "1" để nó không chạy vào "10.0".)


Cái nhìn tích cực không hoạt động ở đây - Lookbehind cần phải có độ rộng bằng không, do đó không được phép định lượng . Dấu ngoặc nhọn ${1} công việc, đây là những gì tôi đã thiếu.
Leeroy

@Leeroy, tôi tin rằng lookbehind có thể có chiều rộng thay đổi trong PowerShell và .NET. Đúng là chúng phải có chiều rộng cố định trong một số hương vị khác của regex, chẳng hạn như trong Boost (C ++).
dangph

Ôi xin lỗi tôi thấy bạn đúng, các giao diện chiều rộng thay đổi được hỗ trợ. Tôi có thể nhận được một trận đấu với regex của bạn, 1 --- 1.00 --- 1.0,. Tôi dường như không thể có được nó để thay thế chính xác tho. -replace $pattern, '10.0' thay đổi tất cả các trường hợp default=something, thay vì chỉ có một 1.0
Leeroy

@Leeroy, đây là một ví dụ. Hãy thử thực hiện điều này: '123abc' -replace '(?<=123)(abc)','xxx' Nó thay thế "abc" bằng "xxx". Nếu bạn thay đổi "123" trong chuỗi ban đầu, việc thay thế sẽ không xảy ra. (Nhưng trong mọi trường hợp, tôi nghĩ cách thứ hai với $1 thay thế có lẽ tốt hơn bởi vì nhiều người sẽ hiểu nó hơn.)
dangph

0

Dung dịch

Nhờ vào @dangph , đây là kịch bản với đề nghị của ông đưa vào.

$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

Cập nhật Regex101

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.