使用JavaScript将字符串按数字、百分比和文本分割。

3
如何拆分这个字符串?
42%回收尼龙 41%尼龙 17%氨纶
拆分为:
42% 回收尼龙 41% 尼龙 17% 氨纶
(使用正则表达式?)
我已经尝试并使用了.split(/\s(?=\d)/),但这将字符串转换为:
42%回收尼龙 41%尼龙 17%氨纶
谢谢

s.split(/\s*(\d+%)\s*/).filter(Boolean); 这个代码段是否符合你的需求?还有其他规则吗? - trincot
6个回答

6
你已经在使用正向先行断言了;你可以与正向后行断言结合使用:
(?<=\%)\s|\s(?=\d)

var s = "42% recycled nylon 41% nylon 17% elastane";
console.log(s.split(/(?<=\%)\s|\s(?=\d)/g))

点击regex101查看详细信息。

1
你可以使用以下正则表达式: /(\d+%)/g 然而,这会导致输出数组中出现一个或多个空字符串。我们可以使用一个巧妙的技巧来消除这些空字符串,即使用.filter(Boolean)。你可以搜索一下它到底是做什么的。
但是还有第二个问题。正则表达式没有去除字符串周围的空格,所以你应该对数组进行映射,并在元素上使用.trim()。因此,你的最终脚本应该像这样:
const string = "42% recycled nylon 41% nylon 17% elastane";
const regex = /(\d+%)/g;
const filtered = string.split(regex).filter(Boolean).map(i => i.trim());

1
不必拆分,你可以匹配正则表达式。
\d+%|[a-z]+(?: [a-z]+)*

设置以下标志:i(不区分大小写)和g(“全局”,意味着在第一个匹配后不返回)。

演示

正则表达式的含义是,“匹配一个或多个(+)数字(\d)或者(|)匹配一个或多个字母([a-z]+),后面跟着一个或多个字母,前面有一个空格((?: [a-z]+)),零次或多次出现(*)。(?:...)表示非捕获组。


0
由于普通文本和带有百分比的数字之间总是用空格分隔,我们可以简单地通过空格将字符串拆分,并使用.map().filter()的组合来连接不是百分比的相邻元素。

let regex = /^[1-9]\d*?(.\d*)%$/g;
let arr = "42.3% recycled nylon 41% nylon 17% elastane".split(" ");
arr = arr.map(
    (item, index) => {
        if (item.match(regex)) {
            return item;
        } else {
            if ((index > 0) && (!arr[index - 1].match(regex))) {
                return "";
            } else {
                for (let subsequent = index + 1; (subsequent < arr.length) && (!arr[subsequent].match(regex)); subsequent++) {
                    if (!arr[subsequent].match(regex)) item += ` ${arr[subsequent]}`;
                }
                return item;
            }
        }
    }
).filter(item => item.length);

console.log(arr);


0
你可以使用捕获组来保留被分割的部分,并匹配可选的周围空白字符。
\s*\b(\d+%)\s*
  • \s* 匹配可选的空白字符
  • \b 单词边界,防止部分单词匹配
  • (\d+%) 捕获组 1,匹配 1 个或多个数字和 %
  • \s* 匹配可选的空白字符

查看 正则表达式演示

然后从结果数组中删除空条目。

或者匹配字符串的开头或 1 个或多个空白字符,并且如果之前或之后没有任何内容,则匹配字符串的结尾或尾随的空白字符

(?:^|\s+)(\d+%)(?:\s+|$)

查看另一个正则表达式演示

const regex = /\s*\b(\d+%)\s*/;
const s = `42% recycled nylon 41% nylon 17% elastane`;

console.log(s.split(regex).filter(Boolean));

在存在至少1个数字和%的左侧或右侧,并带有前导或尾随空白边界的地方以空白字符拆分:
 (?<=(?<!\S)\d+%)\s+|\s+(?=\d+%(?!\S))

正则表达式演示

const regex = /(?<=(?<!\S)\d+%)\s+|\s+(?=\d+%(?!\S))/;
const s = `42% recycled nylon 41% nylon 17% elastane`;

console.log(s.split(regex));


0
这是另一种假设百分比之外没有数字的替代方案。

const s = "42% recycled nylon 41% nylon 17% elastane";
const result = s.match(/[a-z ]+|[\d%]+/ig).map(e => e.trim());
console.log(result);

而且没有(太多)正则表达式,但假设每个单词之间有一个空格:

const s = "42% recycled nylon 41% nylon 17% elastane";
const parts = s.split(/\s+/);
const result = [];

parts.forEach((e, i) => {
  if (
    i === 0 ||
    /\d+%/.test(result.at(-1)) ||
    /\d+%/.test(e)
  ) {
    result.push(e);
  }
  else {
    result[result.length-1] += " " + e;
  }
});

console.log(result);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接