如何使用正则表达式结合replaceAll格式化JavaScript字符串?棋谱符号格式化及代码简化方案问询
一行JavaScript代码完成棋谱字符串的清理与格式调整
需求回顾
原始棋谱字符串:
1. \td11-d9 \te7-e10 \n2. \ta8-c8 \tg7-g10xf10 \n3. \th11-h9 \tf7-i7
需要完成的操作:
- 清理所有制表符、换行符和多余空格,将多个空白字符合并为单个空格
- 移除回合数(如
1.)后的空格(你之前用了.replaceAll('. ', '.')的操作) - 在每个回合数(
1.、2.、3.)前添加3个空格,最终得到目标格式:
1.d11-d9 e7-e10 2.a8-c8 g7-g10xf10 3.h11-h9 f7-i7
一行解决方案代码
const formattedChessNotation = originalStr.replace(/[\t\n\s]+/g, ' ').replace(/\. /g, '.').replace(/(^|\s)(\d+\.)/g, '$1 $2');
代码细节解释
- 第一个
replace(/[\t\n\s]+/g, ' '):匹配所有制表符(\t)、换行符(\n)和连续空格,统一替换为单个空格,一步完成空白字符的清理。 - 第二个
replace(/\. /g, '.'):精准移除回合数后面的空格(比如把1.变成1.),和你之前的.replaceAll('. ', '.')效果完全一致。 - 第三个
replace(/(^|\s)(\d+\.)/g, '$1 $2'):匹配两种场景的回合数——字符串开头的数字.,或者前面带有空格的数字.,将其替换为「原前缀(开头为空/中间为空格) + 3个空格 + 回合数」,完美实现每个回合数前添加3个空格的需求。
如果追求极致精简,还可以把前两个替换操作合并成一个:
const formattedChessNotation = originalStr.replace(/([\t\n\s]+)|(\. )/g, (_, p1, p2) => p1 ? ' ' : '.').replace(/(^|\s)(\d+\.)/g, '$1 $2');
这个版本用一个正则同时匹配空白字符和. ,通过回调函数判断匹配类型,分别替换为单个空格或者.,一步完成清理和移除回合数后空格的操作。
内容的提问来源于stack exchange,提问作者Plamen Draganov
相关产品推荐
相关产品推荐

