我有一个文本区域,其中包含罗马数字列表,我想通过单击按钮将其转换为阿拉伯数字。我怎样才能只替换整个数字而不替换其他数字的一部分。例如,我有:
XI
XXI
XXXI
我明白了
11
X11
XX11
但我想要
11
XXI
XXXI
我使用的代码是:
function romanToArabic() {
var str = document.getElementById("textArea").value;
var mapObj = {
XI:"11",
V:"5"
};
var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
str = str.replace(re, function(matched){
return mapObj[matched];
});
document.getElementById("textArea").value = str;
}
我已经看到了使用\b 的各种解决方案,但我不知道将其放在代码中的位置。谢谢。
最佳答案
我采用了您的规范并使其“正常工作”,作者:
- 定义正确的正则表达式
\b[XIV]+\b
(匹配整个罗马数字) - 使用您的对象作为映射函数,并在失败时作为后备,
mapObj[roman] ||罗马字
脚本不执行的操作:
- 捕获非法罗马数字,即允许
XIIX
- 为匹配实现适当的算法,例如
XV
,理想情况下应解析为10 + 5 = 15
function fromRoman(roman) {
var mapObj = {
XI:"11",
V:"5"
};
return mapObj[roman] || roman;
}
function convertFromRoman() {
var str = document.getElementById("textArea").value;
var output = str.replace(/\b[XIV]+\b/g, fromRoman);
document.getElementById("output").value = output;
}
convertFromRoman();
<p>Input:</p>
<textarea id="textArea" style="width:100%; height:50px" onkeyup="convertFromRoman()">
XI
XXI
XXXI
</textarea>
<p/>
<p>Output:</p>
<textarea id="output" style="width:100%; height:50px">
</textarea>
关于javascript 查找并替换文本区域中的整个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47687615/