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



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

"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_这样的情况变成数组中的单个项目而不是多个项目。

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

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

与其使用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第二次交替:匹配空格
  • [^-*_<> ]+- 第三次交替:匹配任何不是分隔符或空格的内容

尝试(这是改进的确定性能答案(

let split = s => s.match(/([-*_<>])(?:(?!1).)+1| |[^ ]+/g) 
console.log(split("Hello how are you"));
console.log(split("Hello *how* are *you*"));
console.log(split("Hello *how*are_you_"));
console.log(split("*how*are _you_ *doing*_today_ hm?"));

最新更新