发一个中文数字章节替换成阿拉伯数字的宏
emeditor吧
全部回复
仅看楼主
level 4
蔚卿 楼主
新建一个宏,拷贝以下代码,可以实现将TXT小说中的中文数字章节替换成阿拉伯数字
var nFlags = eeFindNext | eeReplaceAll | eeFindReplaceRegExp;
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])千([集卷章节])","第\\1000\\2",nFlags);//第三千章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])百([集卷章节])","第\\100\\2",nFlags);//第三百章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])十([集卷章节])","第\\10\\2",nFlags);//第三十章
document.selection.Replace("第十([集卷章节])","第10\\1",nFlags);//第十章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])千([0-9一二三四五六七八九零〇])百([集卷章节])","第\\1\\200\\3",nFlags);//第三千三百章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])千([0-9一二三四五六七八九零〇])百([0-9一二三四五六七八九零〇])十([集卷章节])","第\\1\\2\\30\\4",nFlags);//第三千三百三十章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])千([0-9一二三四五六七八九零〇])百([0-9一二三四五六七八九零〇])十([0-9一二三四五六七八九零〇])([集卷章节])","第\\1\\2\\3\\4\\5",nFlags);//第三千三百三十三章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])千([0零〇0])([0-9一二三四五六七八九零〇])十([集卷章节])","第\\10\\3\\4",nFlags);//第三千零三十章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])千([0零〇0])([0-9一二三四五六七八九零〇])([集卷章节])","第\\100\\3\\4",nFlags);//第三千零三章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])千([0零〇0])([0-9一二三四五六七八九零〇])十([0-9一二三四五六七八九零〇])([集卷章节])","第\\10\\3\\4\\5",nFlags);//第三千零三十三章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])千([0-9一二三四五六七八九零〇])百([0零〇0])([0-9一二三四五六七八九零〇])([集卷章节])","第\\1\\20\\4\\5",nFlags);//第三千三百零三章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])千([0-9一二三四五六七八九零〇])十([集卷章节])","第\\10\\20\\3",nFlags);//第三千一十章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])千([0-9一二三四五六七八九零〇])十([0-9一二三四五六七八九零〇])([集卷章节])","第\\10\\2\\3\\4",nFlags);//第三千三十三章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])百([0-9一二三四五六七八九零〇])十([集卷章节])","第\\1\\20\\3",nFlags);//第三百三十章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])百([0-9一二三四五六七八九零〇])十([0-9一二三四五六七八九零〇])([集卷章节])","第\\1\\2\\3\\4",nFlags);//第三百三十三章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])百([0零〇0])([0-9一二三四五六七八九零〇])([集卷章节])","第\\10\\3\\4",nFlags);//第三百零三章
document.selection.Replace("第([0-9一二三四五六七八九两零〇0-9])十([0-9一二三四五六七八九零〇])([集卷章节])","第\\1\\2\\3",nFlags);//第三十三章
document.selection.Replace("第十([0-9一二三四五六七八九零〇])([集卷章节])","第1\\1\\2",nFlags);//第十三章
document.selection.Replace("第两([0-9一二三四五六七八九十两百千零〇0-9]{0,6})([集卷章节])","第2\\1\\2",nFlags);//第两百三十三章
var num=4//千位最大2222,循环一次减少1个数字
while(num)
{
num--;
document.selection.Replace("(第[0-9]{0,2})零([0-9一二三四五六七八九十零〇0-9]{0,2})([集卷章节])","\\10\\2\\3",nFlags);
document.selection.Replace("(第[0-9]{0,2})〇([0-9一二三四五六七八九十零〇0-9]{0,2})([集卷章节])","\\10\\2\\3",nFlags);
document.selection.Replace("(第[0-9]{0,4})一([0-9一二三四五六七八九十零〇0-9]{0,4})([集卷章节])","\\11\\2\\3",nFlags);
document.selection.Replace("(第[0-9]{0,4})二([0-9一二三四五六七八九十零〇0-9]{0,4})([集卷章节])","\\12\\2\\3",nFlags);
document.selection.Replace("(第[0-9]{0,4})三([0-9一二三四五六七八九十零〇0-9]{0,4})([集卷章节])","\\13\\2\\3",nFlags);
document.selection.Replace("(第[0-9]{0,4})四([0-9一二三四五六七八九十零〇0-9]{0,4})([集卷章节])","\\14\\2\\3",nFlags);
document.selection.Replace("(第[0-9]{0,4})五([0-9一二三四五六七八九十零〇0-9]{0,4})([集卷章节])","\\15\\2\\3",nFlags);
document.selection.Replace("(第[0-9]{0,4})六([0-9一二三四五六七八九十零〇0-9]{0,4})([集卷章节])","\\16\\2\\3",nFlags);
document.selection.Replace("(第[0-9]{0,4})七([0-9一二三四五六七八九十零〇0-9]{0,4})([集卷章节])","\\17\\2\\3",nFlags);
document.selection.Replace("(第[0-9]{0,4})八([0-9一二三四五六七八九十零〇0-9]{0,4})([集卷章节])","\\18\\2\\3",nFlags);
document.selection.Replace("(第[0-9]{0,4})九([0-9一二三四五六七八九十零〇0-9]{0,4})([集卷章节])","\\19\\2\\3",nFlags);}
2020年05月19日 08点05分 1
level 1
[大拇指]非常有用 感谢
2020年09月28日 07点09分 2
level 12
能替换一千章以后的吗?
2020年10月09日 21点10分 3
可以啊
2020年10月19日 03点10分
level 1
好用,谢谢楼主
2024年05月15日 11点05分 5
level 1
用正则不是更简单吗 简单得多
2024年09月29日 14点09分 6
正则咋改数字?
2025年12月19日 13点12分
level 1
挺好,但一楼的代码运行后不能撤销。
我贴一个反过来的,把包含阿拉伯数字的‘第1’到‘第9999’转换成包含汉字数字‘第一’到...的宏,是刚用谷歌Gemini3pro写的:
#language = "JScript"
//谷歌Gemini3pro 写的在Emeditor里可以把包含阿拉伯数字的‘第1’到‘第9999’转换成包含汉字数字‘第一’到...的宏
// 宏描述:将“第1”到“第1000”及以上的数字智能转换为中文
// 功能:支持自动进位、补零(如105->一百零五)、习惯修正(如12->十二)
// 开始一个撤销组,这样按一次 Ctrl+Z 就能撤销全部更改
//document.selection.StartGroup(); 但是我的emeditor不支持此功能,所以封上此句,以及倒数第二行封上了。
// 1. 获取当前文本(如果有选区则处理选区,否则处理全文)
var isSelection = !document.selection.IsEmpty;
if (!isSelection) {
document.selection.SelectAll();
}
var text = document.selection.Text;
// 2. 定义数字转中文的核心函数
function numberToChinese(num) {
var chnNumChar = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
var chnUnitChar = ["", "十", "百", "千", "万"];
var strIns = "", chnStr = "";
var unitPos = 0;
var zero = true;
if (num === 0) return chnNumChar[0];
// 循环取余法转换
while (num > 0) {
var v = num % 10;
if (v === 0) {
if (!zero) {
zero = true;
chnStr = chnNumChar[v] + chnStr;
}
} else {
zero = false;
strIns = chnNumChar[v];
strIns += chnUnitChar[unitPos];
chnStr = strIns + chnStr;
}
unitPos++;
num = Math.floor(num / 10);
}
// 【重要修正】符合中文阅读习惯
// 1. 如果结果以“一十”开头(例如12变成一十二),去掉前面的“一”,变成“十二”
// 但是 110 (一百一十) 里的“一十”不能去,所以只判断字符串开头
if (chnStr.length > 1 && chnStr.substr(0, 2) == "一十") {
chnStr = chnStr.substr(1);
}
return chnStr;
}
// 3. 使用正则表达式查找并替换
// 正则含义:匹配 "第" + 连续数字 + (非数字边界)
// (?!\d) 确保不会把 "第1" 匹配成 "第100" 的一部分
var regex = /第([0-9]+)(?!\d)/g;
var result = text.replace(regex, function(match, numStr) {
var num = parseInt(numStr, 10);
// 这里可以加一个判断,如果你只严格想转1000以内的
// if (num > 1000) return match;
return "第" + numberToChinese(num);
});
// 4. 将处理后的文本写回编辑器
document.selection.Text = result;
// 5. 恢复光标状态(如果是全文替换,替换后取消全选)
if (!isSelection) {
document.selection.Collapse();
}
//document.selection.EndGroup();
Status = "转换完成:已将所有“第x”格式转换为中文数字。";
2025年12月19日 13点12分 7
谢谢大佬分享!
2025年12月22日 04点12分
level 1
再发一个,是仿照了楼主的宏,把 香港数字(可能是半角数字)转换成普通阿拉伯数字的宏,要想撤销得撤十次😀:
//自制 emeditor香港数字替换成阿拉伯数字的宏
var nFlags = eeFindNext | eeReplaceAll | eeFindReplaceRegExp;
document.selection.Replace("0","0",nFlags);
document.selection.Replace("1","1",nFlags);
document.selection.Replace("2","2",nFlags);
document.selection.Replace("3","3",nFlags);
document.selection.Replace("4","4",nFlags);
document.selection.Replace("5","5",nFlags);
document.selection.Replace("6","6",nFlags);
document.selection.Replace("7","7",nFlags);
document.selection.Replace("8","8",nFlags);
document.selection.Replace("9","9",nFlags);
2025年12月20日 15点12分 8
假如仅仅是全角和半角之间的转换,可以看看标准功能:编辑→全角/半角。直接回复无法贴图,我单独开一个回复。
2025年12月22日 04点12分
level 1
@步海马
关于全角与半角的转换,有标准功能:
2025年12月22日 04点12分 9
哈,谢谢,又学了一招。我这21版的转换是藏在编辑里的,我都没注意过。
2025年12月22日 11点12分
1