用正则表达式删除中文单词之间的所有空格

时间:2019-01-14 09:58:55

标签: javascript regex

我想删除仅中文文本中的所有空格。

我的文本"請 把 這 裡 的 10 多 個 字 合 併. Can you help me?"

理想的输出: "請把這裡的 10 多個字合併. Can you help me?"

var str = '請 把 這 裡 的 10 多 個 字 合 併. Can you help me?';
str = str.replace("/\ /", "");

我已经研究过a similar question for Python,但在我的情况下似乎不起作用,所以我在这里提出问题以寻求帮助。

6 个答案:

答案 0 :(得分:30)

开始使用中文字符匹配模式

使用Unicode Tools,可以将与任何中文字符匹配的\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 regular expression transpiler将其移植到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')

请参见regex demo

如果您的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'));

答案 1 :(得分:21)

使用@Brett Zamir解决如何在正则表达式中匹配汉字

Javascript unicode string, chinese character but no punctuation


InputStream inStream = context.getAssets().open(filename);
Scanner s = new Scanner(inStream).useDelimiter("\\A");
String string = s.hasNext() ? s.next() : "";
inStream.close();
return string;


它看起来像:

const str = '請 把 這 裡 的 10 多 個 字 合 併. Can you help me?';

const regex = new RegExp('([\u4E00-\u9FCC\u3400-\u4DB5\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d]) ([\u4E00-\u9FCC\u3400-\u4DB5\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d])* ', 'g');

const ret = str.replace(regex, '$1$2');

console.log(ret);

答案 2 :(得分:9)

汉字的范围可以写为[\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC],因此您可以使用此正则表达式来选择汉字和空格,并通过前面的(?=[\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC]+)确保其后跟汉字,< / p>

([\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC]+)\s+(?=[\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC]+)

并用$1

替换

Demo

var str = '請 把把把把把 這 裡裡裡裡裡 的 10 多多多多 個 字 合 併. Can you help me?';
console.log(str.replace(/([\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC]+)\s+(?=[\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC]+)/g, "$1"));

答案 3 :(得分:4)

尝试

str.replace(/ ([\u4E00-\u9FCC])|([ -~]+ )/g, '$1$2');

解决方案可以处理带有\ u4E00- \ u9FCC编码的巫婆ascii字符和中英文字母(我从here获得它们-它包含大约20000个字符,足以应付日常使用,但并非所有的中文字母)。

var str = '請 把 這 裡 的 10 多 個 字 合 併. Can you help me?';
str = str.replace(/ ([\u4E00-\u9FCC])|([ -~]+ )/g, '$1$2');

console.log(str);

答案 4 :(得分:0)

另一种解决方案,使用带有/[\u3400-\u9FBF]/ match()的中文字母代码的more details方法

str.match(/[\u3400-\u9FBF]/) // to detect if char is a chinese word

我的脚本删除中文字符之间的空格

var chine = '請 把 這 裡 的 10 多 個 字 合 併. Can you help me?';
//split the text by space
var spl = chine.trim().split(/\s+/);  //Output spl = ["請","把","這",'裡','的','10','多','個'...];
var result = '';
for (var i = 0; i < spl.length; i++) {
  //check if the current char is a chinese word and the next char is a chinese word if true we remove space between them
  if (spl[i].match(/[\u3400-\u9FBF]/) && spl[i+1].match(/[\u3400-\u9FBF]/)) 
     result += spl[i];     
   else 
     result += spl[i] + ' '; //if the current char is not a chinese word we use space between them
}
 console.log(result);

  • 使用map()函数代替

var chine = '請 把 這 裡 的 10 多 個 字 合 併. Can you help me?';
var result = '';
chine.split(/\s+/).map(function(item,i,elm) { 
if (item.match(/[\u3400-\u9FBF]/) && elm[i+1].match(/[\u3400-\u9FBF]/)) 
     result += item;     
   else 
     result += item + ' ';
})
 console.log(result);

答案 5 :(得分:0)

这在您的情况下可能很有用。 (?<![ -~]) (?![ -~])