2017-06-02 80 views
3

我正在將一個多元化器移植到Rust中,並且我在正則表達式中遇到了一些困難。我無法像我所期望的那樣使用Regex::replace()方法替換已編號的捕獲組。例如,下面顯示一個空字符串:無法獲得`Regex :: replace()`來替換已編號的捕獲組

let re = Regex::new("(m|l)ouse").unwrap(); 
println!("{}", re.replace("mouse", "$1ice")); 

我希望它打印 「老鼠」,因爲它在JavaScript(或斯威夫特,Python和C#或轉到)確實

var re = RegExp("(m|l)ouse") 
console.log("mouse".replace(re, "$1ice")) 

是有一些方法我應該使用,而不是Regex::replace()

審視Inflector crate,我看到它提取第一個捕獲組,然後追加後綴來捕獲文本:

if let Some(c) = rule.captures(&non_plural_string) { 
    if let Some(c) = c.get(1) { 
     return format!("{}{}", c.as_str(), replace); 
    } 
} 

然而,鑑於replace作品在所有其他語言我用正則表達式在我看來,它也適用於Rust。

回答

5

正如the documentation提到:

最長可能的名稱使用。例如$1a查找名爲1a的捕獲組,而不是索引1處的捕獲組。要對名稱進行更精確的控制,請使用括號,例如${1}a

而且

有時替換字符串需要使用大括號來 劃定捕獲組替換和周圍的文字文本。 例如,如果我們想用 下劃線將兩個詞放在一起:

let re = Regex::new(r"(?P<first>\w+)\s+(?P<second>\w+)").unwrap(); 
let result = re.replace("deep fried", "${first}_$second"); 
assert_eq!(result, "deep_fried"); 

沒有大括號,捕獲組名first_將被使用, 而且由於它不存在,這將是替換爲空的 字符串。

你想re.replace("mouse", "${1}ice")

+0

我無法相信我錯過了。我必須讀過那部分20次。這很好用!謝謝! –