我有一个带有罗马数字列表的文本区域,我希望通过单击按钮将其转换为阿拉伯数字。如何仅替换整数而不替换其他数字的部分。例如,我有:
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的各种解决方案,但我无法弄清楚将它放在我的代码中的哪个位置。感谢。
答案 0 :(得分:3)
我接受了你的规范并通过以下方式完成了工作"
\b[XIV]+\b
(匹配整个罗马数字)mapObj[roman] || 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>
&#13;
答案 1 :(得分:1)
您需要的是将\\b
添加到正则表达式的开头和结尾。它将匹配整个单词。
function romanToArabic() {
var str = document.getElementById("textArea").value;
var mapObj = {
XI:"11",
V:"5"
};
var re = new RegExp("\\b(" + Object.keys(mapObj).join("|") + ")\\b","gi");
str = str.replace(re, function(matched){
return mapObj[matched];
});
document.getElementById("textArea").value = str;
}
<textarea id="textArea" style="width: 400px; height: 100px"></textarea>
<br />
<button onClick="romanToArabic()">Convert</button>
答案 2 :(得分:0)
这是另一种方法,只需将textArea值拆分为新行('\n')
。
var val=["XI", "XXI", "XXXI"]; // $("textarea").val().split('\n');
var outPut = [];
$.each(val, function(index, object) {
if(object.length == 2){
outPut.push(object.replace("XI",'11'));
}else{
outPut.push(object);
}
console.log(outPut[outPut.length-1]);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>