从间隔的单词中删除空格?

Remove whitespace from spaced-out word?

假设以下字符串:

hello world, h e l l o! hi. I am happy to see you!

有没有办法像这样删除间隔单词中的空格?:

hello world, hello! hi. I am happy to see you!

我试过 [^ ]+(\s) 但捕获组匹配所有空格。谢谢。

一种正则表达式方法可能是:

var input = "hello world, h e l l o! hi. I am happy to see you!";
var output = input.replace(/(?<=\b\w)\s+(?=\w\b)/g, "");
console.log(output);

这里是对正则表达式模式的解释,它针对位于两侧两个独立的单个单词字符之间的空白:

(?<=\b\w)  assert that what precedes is a single character
\s+        match one or more whitespace characters
(?=\w\b)   assert that what follows is a single character

由于您已标记 pcre,另一个选项可能是:

(?:\b\w\b|\G(?!^))\K\h(?=\w\b)

说明

  • (?: 交替的非捕获组 |
    • \b\w\b 匹配单词边界之间的单个单词字符
    • |
    • \G(?!^) 断言上一场比赛结束时的位置,而不是开始
  • )关闭非捕获组
  • \K\h忘记到目前为止匹配的是什么,匹配单个水平白色space 字符
  • (?=\w\b) 正面前瞻,断言单个单词 char 后跟右侧的单词边界

Regex demo

在替换中使用空字符串。


另一个选项可能是在单个单词字符序列中匹配至少 2 个字符,并在替换中删除 space.

请注意 \s 也可以匹配换行符。

const regex = /\b\w(?: \w)+\b/g
const str = "hello world, h e l l o! hi. I am happy to see you!";
let res = str.replace(regex, m => m.replace(/ /g, ''));
console.log(res);