我正在用 Rust 撰寫一個小型 CLI 應用程式。它處理用戶輸入,如果發現特殊的轉義字符,則需要對其進行解釋。
例如,如果用戶輸入一個字串'New\nLine',它應該被解釋為:
換
行
到目前為止,這是我的代碼
fn main() {
let text: Vec<String> = vec![String::from(r"New\n"),
String::from(r"Line")];
slash_parser(text);
}
fn slash_parser(text: Vec<String>) {
let mut text = text.join(" ");
println!("{}", text); // ---> New\n Line
if text.contains("\\") {
text = str::replace(&text, r"\n", r"\\n");
println!("{}", text); // ---> New\\n Line
println!("New\nLine") // ---> New
// ---> Line
}
}
我認為在字串中添加額外\內容會使其被解釋為新行,但我顯然錯了。
出于某種原因,如果作為引數傳入的字串將被解釋為沒有特殊字符的字串。
但是如果字串列印為字串文字,則該\n符號被解釋為新行。
我在這里理解錯了什么,以及如何將\n字串中的它解釋為新行?
uj5u.com熱心網友回復:
我認為您誤解了字串文字中的轉義是如何作業的。
快速的答案是:
text當您構造錯誤的字串時,其中已經包含換行符。我想你的意思是"New\\n"或r"New\n"。- 用換行符替換
'\'and ,做: .'n'text = str::replace(&text, "\\n", "\n");
背景:字串文字和轉義
字串文字"New\nLine"不包含字符'\'和'n'。\n是單個字符,\這里是一個所謂的轉義字符,它允許創建特殊字符。像換行符一樣\n:
let s = "New\nLine";
println!("{:?}", s.chars().collect::<Vec<_>>());
println!("{}", s);
['N', 'e', 'w', '\n', 'L', 'i', 'n', 'e']
New
Line
但是如果用戶輸入的話,肯定是\和.這兩個字符n。要創建實際包含這兩個字符的字串文字,您必須轉義\否則將\n被解釋為單個字符:
let s = "New\\nLine";
println!("{:?}", s.chars().collect::<Vec<_>>());
println!("{}", s);
['N', 'e', 'w', '\\', 'n', 'L', 'i', 'n', 'e']
New\nLine
請注意,\此處的字符顯示為\\。在允許轉義的表示中,\\用于表示實際\字符。
或者,您可以創建一個不執行轉義的原始字串文字;意思是,所見即所得:
let s = r#"New\nLine"#;
println!("{:?}", s.chars().collect::<Vec<_>>());
println!("{}", s);
['N', 'e', 'w', '\\', 'n', 'L', 'i', 'n', 'e']
New\nLine
實際問題:解釋用戶字串
所以如果我們得到一個用戶字串,它肯定不包含字符\n,而是兩個字符\和n。所以讓我們使用原始字串r#"New\nLine"來表示用戶輸入。
現在我們可以簡單地用特殊字符替換'\'and'n'字符'\n':
fn main() {
let s = r#"New\nLine"#;
let s_unescaped = s.replace("\\n", "\n");
println!("User input:\n{}\n", s);
println!("Unescaped:\n{}", s_unescaped);
}
User input:
New\nLine
Unescaped:
New
Line
用.replace("\\n", "\n"),我們替換字串"\\n",它是字符\,n用"\n",它是換行符。
當然,"\\n"我們可以撰寫原始字串,而不是r"\n":
let s_unescaped = s.replace(r"\n", "\n");
附加說明
Display( {}) 和Debug( {:?}) 以不同方式列印字串也引起了很多混淆。雖然{}以未轉義的形式列印它(意味著換行符實際上被列印為換行符),但在列印之前{:?} 轉義字串:
fn main() {
let s = "New\nLine";
println!("{}", s);
println!("{:?}", s);
println!("---");
let s = "New\\nLine";
println!("{}", s);
println!("{:?}", s);
}
New
Line
"New\nLine"
---
New\nLine
"New\\nLine"
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/490492.html
