Dosya içindeki yakalama grubunu bul ve değiştir


0

Bir metin dosyasını okumaya çalışıyorum, hangi dilde olduğu önemli değil ...

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

... bir dize bul

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

... ve yakalama grubunu ( (.+?)) başka bir dizeyle (örneğin 10.0) değiştirin. Sonra dosyaya yazın ve kapatın.

Yakalama grubunu yerinde değiştirebileceğim ve dosyayı kaydedebileceğim şekilde nasıl alabilirim? Tüm denemelerim, yakalanan olmayan grupla tüm eşleşen çizgiyi değiştirir.


Lütfen okuyun Kendi soruma cevap verebilir miyim? ve soruya cevap verme.
DavidPostill

Yanıtlar:


1

Yakalamayan grup yerine pozitif bir gözbebek grubu deneyin :

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

Lookbehind grubunun eşleşmesi gerekecek, ancak hiçbir karakter kullanmayacak.

Yedek dize sadece olacak '10.0'.

Yakalamayan grubu normal bir gruba dönüştürmek daha az egzotik bir yol olacaktır:

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

Değişim dizgisi '${1}10.0'(tek tırnaklı) olacaktır. ${1}İlk grubunu temsil eder. ("1" etrafındaki kıvrık parantezlere ihtiyacınız vardır, böylece "10.0" içine girmeyecektir.)


Olumlu gözbebek burada çalışmaz - Gözbebeklerin sıfır genişliğinde olmaları gerekir, bu nedenle nicelendiricilere izin verilmez . Kıvrımlı ayraçlar ${1}işe yarıyor, eksik olan buydu.
Leeroy,

@Leeroy, görünüşe göre gözlerinin PowerShell ve .NET'te değişken genişlikte olabileceğine inanıyorum. Boost (C ++) gibi diğer bazı regex lezzetlerinde sabit genişlikte olmaları gerektiği doğrudur.
salı

Oh üzgünüm haklısın, değişken genişlikteki gözbebekleri desteklenir. Ben senin regex ile bir maç olsun, olabilir 1 --- 1.0ve 0 --- 1.0,. Doğru bir şekilde yerine koymak için elde edemiyorum tho. sadece bunun yerine -replace $pattern, '10.0'tüm örneklerini değiştirirdefault=something1.0
Leeroy,

@Leeroy, işte bir örnek. Bunu çalıştırmayı deneyin: '123abc' -replace '(?<=123)(abc)','xxx' "abc" ifadesini "xxx" ile değiştirir. Orijinal dizedeki "123" ü değiştirirseniz, değiştirme gerçekleşmez. (Ama her durumda, $1yerine
koymanın

0

Çözüm

@ Dangph için teşekkürler, önerisinin yer aldığı senaryo burada.

$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

Güncelleme Regex101

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.