我正在使用使用 rust 正則運算式的sd工具,并且我試圖將它與命名捕獲組一起使用,但是如果在替換中命名捕獲組位于字串之前,那么該字串將作為潛在的命名捕獲組,導致意外行為。
這是一個人為的例子來說明這個問題:
echo 'abc' | sd -p '(?P<cg>b)' '$cgB'
# outputs: ac
# desired output: abBc
echo 'abc' | sd -p '(?P<cg>b)' '$cg B'
# outputs as expected: ab Bc
# however, places a space there
我試過$<cg>B,$cg(B),$cg\0B,各不相讓abBc。
我還檢查了rust regex 檔案,但是 x 標志和其他技術似乎只適用于搜索模式,而不適用于替換模式。
uj5u.com熱心網友回復:
我們不需要該sd工具來重現此行為。這是純 Rust:
let re = regex::Regex::new(r"(?P<n>b)").unwrap();
let before = "abc";
assert_eq!(re.replace_all(before, "$nB"), "ac");
assert_eq!(re.replace_all(before, "${n}B"), "abBc");
前面的檔案中沒有描述大括號替換語法,而是在方法的檔案中replace:
使用最長的名稱。例如,$1a 查找名為 1a 的捕獲組,而不是索引 1 處的捕獲組。要對名稱進行更精確的控制,請使用大括號,例如 ${1}a。
簡而言之,除非在替換模式之后有一個字符不能成為名稱的一部分,否則您應該始終將組名稱放在大括號之間。
uj5u.com熱心網友回復:
我想出了這個 bash 特定的解決方案,但我真的希望有一個更好的解決方案:
echo 'abc' | sd -p '(?P<cg>b)' $'$cg \bB'
uj5u.com熱心網友回復:
弄清楚了:
echo 'abc' | sd -p '(?P<cg>b)' '${cg}B'
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371593.html
上一篇:如何用相同的替換替換不同的圖案?
