javascript - 用正则表达式删除中文单词之间的所有空格
问题描述
我只想删除中文文本中的所有空格。
我的文字: "請 把 這 裡 的 10 多 個 字 合 併. Can you help me?"
理想输出: "請把這裡的 10 多個字合併. Can you help me?"
var str = '請 把 這 裡 的 10 多 個 字 合 併. Can you help me?';
str = str.replace("/\ /", "");
我研究了一个类似的 Python 问题,但它似乎不适用于我的情况,所以我把我的问题带到这里寻求帮助。
解决方案
获取中文字符匹配模式
使用Unicode 工具,\p{Han}
可以将匹配任何中文字符的 Unicode 属性类翻译成
[\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FEF\uF900-\uFA6D\uFA70-\uFAD9\U00020000-\U0002A6D6\U0002A700-\U0002B734\U0002B740-\U0002B81D\U0002B820-\U0002CEA1\U0002CEB0-\U0002EBE0\U0002F800-\U0002FA1D]
在 ES6 中,要匹配单个中文字符,它可以用作
/[\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FEF\uF900-\uFA6D\uFA70-\uFAD9\u{20000}-\u{2A6D6}\u{2A700}-\u{2B734}\u{2B740}-\u{2B81D}\u{2B820}-\u{2CEA1}\u{2CEB0}-\u{2EBE0}\u{2F800}-\u{2FA1D}]/u
使用ES2015 Unicode 正则表达式转译器将其转译为 ES5 ,我们得到
(?:[\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FEF\uF900-\uFA6D\uFA70-\uFAD9]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D])
使用 JS 匹配任何中文字符的模式RegExp
。
所以,你可以使用
s.replace(/([\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FEF\uF900-\uFA6D\uFA70-\uFAD9]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D])\s+(?=(?:[\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FEF\uF900-\uFA6D\uFA70-\uFAD9]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]))/g, '$1')
请参阅正则表达式演示。
如果您的 JS 环境符合 ECMAScript 2018,您可以使用更短的
s.replace(/(\p{Script=Hani})\s+(?=\p{Script=Hani})/gu, '$1')
图案细节
(CHINESE_CHAR_PATTERN)
- 捕获组 1($1
在替换模式中):任何中文字符\s+
- 任何 1+ 个空格(任何 Unicode 空格)(?=CHINESE_CHAR_PATTERN)
- 当前位置的右侧必须有一个中文字符。
JS 演示:
var s = "請 把 這 裡 的 10 多 個 字 合 併. Can you help me?";
var HanChr = "[\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u3005\\u3007\\u3021-\\u3029\\u3038-\\u303B\\u3400-\\u4DB5\\u4E00-\\u9FEF\\uF900-\\uFA6D\\uFA70-\\uFAD9]|[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]";
console.log(s.replace(new RegExp('(' + HanChr + ')\\s+(?=(?:' + HanChr + '))', 'g'), '$1'));
符合 ECMAScript 2018 标准的正则表达式测试:
var s = "請 把 這 裡 的 10 多 個 字 合 併. Can you help me?";
console.log(s.replace(/(\p{Script=Hani})\s+(?=\p{Script=Hani})/gu, '$1'));
推荐阅读
- python-3.x - Python3 解码字节
- javascript - 为什么 Uptime 命令给我一个错误?';' 预期 Discord.js
- node.js - 如何收听使用非现有字段创建的 Firestore 文档并在 Cloud Functions 中设置默认值?
- r - 我在 shapefile 中读取和绘制它的方式有问题吗?
- javascript - 使用 react-table 7,当使用双向绑定到表的数据源时,可编辑单元格会在每次更改时重新呈现,我失去了对输入的关注
- laravel - Laravel Eloquent 在 Select2 中显示父子数据
- python - 使用 Python 的 Amazon Seller Central Selenium 下拉选择错误
- android - 使用小米设备从 mysql 中获取数据
- css - 网格元素的顺序对视觉结果 CSS 没有影响
- python - pymysql 语句谁是正确的?