讓我們先從karthik manchala
答案,Shepmaster
建議:
發生在陣列中的所有字符串和迭代這個數組。如果你的 應用邏輯是「用B替換所有的A,那麼所有的C都用D,那麼所有的E都用F」,那麼代碼就會反映那個重複的邏輯。
而不是將字符串保留在數組中我建議將編譯的正則表達式存儲在那裏以避免每次重建它們。
下面的代碼:
extern crate regex;
use regex::Regex;
use std::env::args;
use std::iter::FromIterator;
fn main() {
let patterns = [("your", "mine"), ("you are", "I am")];
let patterns = Vec::from_iter(patterns.into_iter().map(|&(k, v)| {
(Regex::new(k).expect(&format!("Can't compile the regular expression: {}", k)),
v)
}));
for arg in args().skip(1) {
println!("Argument: {}", arg);
for &(ref re, replacement) in patterns.iter() {
let got = re.replace_all(&arg, replacement);
if got != arg {
println!("Changed to: {}", got);
continue;
}
}
}
}
這將是它,但爲了完整起見,我想補充一點,如果你想優越的性能,那麼你可能使用本MARK
特徵在PCRE
正則表達式引擎(pcre crate)。
隨着MARK
和模式這樣
"(?x)^(?:
(*MARK:0) first pattern \
| (*MARK:1) second pattern \
| (*MARK:2) third pattern \
)"
可以使用MARK
數量進行分類或在您的情況爲指標與替代的數組。這通常比使用多個正則表達式更好,因爲主題字符串只處理一次。
如何編寫2個單獨的replace_all語句? –
您最後一個帶有'fn_with_pattern_matching'的代碼片段應該可行。請參閱'regex'文檔中的示例:http://doc.rust-lang.org/regex/regex/enum.Regex.html#examples-2您可能需要利用捕獲組來確定將哪些文本儘管用作替代品。 – BurntSushi5
@ BurntSushi5,是啊我試過使用捕獲組,但我有很多理解文檔的麻煩,似乎無法讓它按預期工作 – Vin