javascript - 如何在保持分隔符的同时根据空格或符号拆分字符串?

标签 javascript regex string split

我正在尝试根据空格或某些符号(目前为 *_-<>)拆分字符串。我将给出一些输入和输出的例子:

"Hello how are you" -> [ "Hello", " ", "how", " ", "are", " ", "you" ]

"Hello *how* are *you*" -> [ "Hello", " ", "*how*", " ", "are", " ", "*you*" ]

"Hello *how*are_you_" -> [ "Hello", " ", "*how*", "are", "_you_" ]

"*how*are _you_ \*doing*_today_ hm?" -> [ "*how*", "are", " ", "_you_", " ", "\*doing*", "_today_", " ", "hm?"

不幸的是,拆分空间会变成类似 *how*_are_ 的情况放入数组中的单个项目而不是多个项目。

我也尝试过使用 Regex 进行拆分,但不幸的是它没有保留每个单词周围的符号。

抱歉,如果这有点令人困惑。有没有好的方法来处理这个问题?

最佳答案

而不是使用 split , 一种选择是使用 .match : 匹配其中一个符号,后跟不是该符号的字符,再后跟该符号,匹配非空格、非符号字符:

// Put the dash first, because it will be put into a character set:
const delims = '-*_<>';

// Construct a pattern like:
// ([-*_<>])(?:(?!\1).)+\1| |[^-*_<> ]+

const patternStr = String.raw
`([${delims}])(?:(?!\1).)+\1| |[^${delims} ]+`
const pattern = new RegExp(patternStr, 'g');

const doMatch = str => str.match(pattern);
console.log(doMatch("Hello how are you"));
console.log(doMatch("Hello *how*are_you_"));
console.log(doMatch("*how*are _you_ \*doing*_today_ hm?"));

([-*_<>])(?:(?!\1).)+\1|[^-*_<> ]+意思是:

  • ([-*_<>])(?:(?!\1).)+\1 - 第一次交替:
    • ([-*_<>]) - 匹配并捕获初始分隔符
    • (?:(?!\1).)+ - 后跟不是初始分隔符的任何字符
    • \1 - 紧接着再次是初始分隔符
  • \s第二次交替:匹配一个空格
  • [^-*_<> ]+ - 第三次交替:匹配任何不是定界符或空格的内容

关于javascript - 如何在保持分隔符的同时根据空格或符号拆分字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57952411/

相关文章:

javascript - 为什么 Date.parse ('2012-01-01' ) 和 Date.parse ('1/1/2012' ) 返回不同的值?

javascript - 单击按钮时如何在文本后面获取图像

python - 被正则表达式难住了

ruby-on-rails - 在字符串 rails 中提取数组

javascript - Node.JS 没有附加字符串奇怪的错误?

javascript - JQuery 选择没有类的 tr 元素

java - 计算除字符串末尾以外的字符的所有出现次数

javascript - 从字符串解析 float

c - 这应该产生 gcc 警告吗?

Python 小写​​和大写字符串