[英]Can't replace \r character
每當我的代碼有點令人沮喪時,我會進行大量實驗並創建HTML模板(空白,畫布,應用程序等)。 我可以在Notepad ++中為各種模板創建宏,但手動執行此操作並不那么有效。 由於我已經在shortcuts.xml
文件中找到了如何保存宏的shortcuts.xml
,因此格式如下:
<NotepadPlus>
<InternalCommands>
<Shortcut id="42023" Ctrl="yes" Alt="no" Shift="yes" Key="81" />
</InternalCommands>
<Macros>
<Macro name="Blank HTML5" Ctrl="no" Alt="no" Shift="no" Key="0">
<Action type="1" message="2170" wParam="0" lParam="0" sParam="<" />
<Action type="1" message="2170" wParam="0" lParam="0" sParam="!" />
<Action type="1" message="2170" wParam="0" lParam="0" sParam="D" />
<Action type="1" message="2170" wParam="0" lParam="0" sParam="O" />
<Action type="1" message="2170" wParam="0" lParam="0" sParam="C" />
我想過以編程方式創建模板,這就是我想出來的: jsfiddle
var inputBox = document.getElementById("input"); var outputBox = document.getElementById("output"); var convertButton = document.getElementById("convert"); var dict = [ [/</, "<"], [/>/, ">"], [/\\r/, "
"], [/\\n/, "
"], ]; convertButton.onclick = function convertTextToMacro() { var chars = inputBox.value.split(""); var macro = '<Macro name="" Ctrl="no" Alt="no" Shift="no" Key="0">\\r\\n'; for (var i = 0; i < chars.length; i++) { var c = chars[i]; for (var j = 0; j < dict.length; j++) { c = c.replace(dict[j][0], dict[j][1]); } macro += ' <Action type="1" message="2170" wParam="0" lParam="0" sParam="' + c + '">\\r\\n'; } macro += '</Macro>'; outputBox.value = macro; };
* { margin: 0; padding: 0 } body { background: gainsboro; } #main { display: table; margin: 20px auto; background: rgb(250, 250, 250); padding: 20px; border: 1px solid darkgray; box-shadow: 0 0 2px rgba(0, 0, 0, .2); } textarea { padding: 5px; width: 600px; height: 300px; display: block; font-size: 13px; line-height: 1.5; } #input { height: 150px; } input { display: block; padding: 5px 10px; margin: 5px 0; }
<div id="main"> <textarea id="input" placeholder="Input"> <html> <body></body> </html> </textarea> <input type="button" id="convert" value="Create macro" /> <textarea id="output" placeholder="Output"></textarea> </div>
有4個字符需要轉義:
var dict = [
[/</, "<"],
[/>/, ">"],
[/\r/, "
"],
[/\n/, "
"],
];
我可以替換<
, >
和\\n
,但似乎無法替換\\r
。 奇怪的是,這似乎只發生在這種特殊情況下。 如果我省略\\n
var dict = [
[/</, "<"],
[/>/, ">"],
[/\r/, "
"],
// [/\n/, "
"],
];
我得到一個不同的輸出: jsfiddle
在以下示例中:
var greet = "Hello\rWorld".replace(/\r/, "
");
console.log(greet); // "Hello
World"
var chr = "\r".split("")[0].replace(/\r/, "
");
console.log(chr); // "
"
\\r
被替換。 我究竟做錯了什么?
問題是你的textarea中實際上沒有任何\\ r \\ n字符。
\\r
是回車符, \\n
是換行符。 在Windows上,每個新行都由兩個字符表示: \\r\\n
在linux上它只是\\n
。
為了避免您擔心這個問題,瀏覽器正在剝離\\r
\\n
並且只留下\\n
。
您可以看到這種情況,因為您可以在運行代碼之前重新添加\\r
\\n
字符以與每個\\n
一起使用(這有點無意義,但顯示其余代碼很好)
var inputBox = document.getElementById("input");
var outputBox = document.getElementById("output");
var convertButton = document.getElementById("convert");
var dict = [
[/</, "<"],
[/>/, ">"],
[/\r/, "
"],
[/\n/, "
"]
];
convertButton.onclick = function convertTextToMacro() {
var value = inputBox.value.replace(/\n/g,'\r\n');
var chars = value.split("");
var macro = '<Macro name="" Ctrl="no" Alt="no" Shift="no" Key="0">\r\n';
for (var i = 0; i < chars.length; i++) {
var c = chars[i];
for (var j = 0; j < dict.length; j++) {
c = c.replace(dict[j][0], dict[j][1]);
}
macro += ' <Action type="1" message="2170" wParam="0" lParam="0" sParam="' + c + '">\r\n';
}
macro += '</Macro>';
outputBox.value = macro;
};
所以問題是你真的需要包含\\r
字符嗎? 如果你這樣做,我不確定是否有文本框的解決方案。
我並不是100%確定所有瀏覽器都這樣做 - 所以在啟動之前可能需要剝離它們,以防萬一var value = inputBox.value.replace(/\\r/g,'');
嘗試更換\\r\\n
代替\\r
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.