regex 在JavaScript中使用数字、百分比和文本拆分字符串

gfttwv5a  于 2023-08-08  发布在  Java
关注(0)|答案(5)|浏览(67)

我怎么能把这串分开

  • 42%再生尼龙41%尼龙17%弹性纤维 *

进入

  • 42%

再生尼龙
41%
尼龙
百分之十七
弹性纤维 *
(with regex?
我已经试过使用.split(/\s(?=\d)/)但这会将字符串变成这样:

  • 42%回收尼龙

41%尼龙
17%弹性纤维 *
谢谢你的好意

p5fdfcr1

p5fdfcr11#

你已经在使用正向前瞻;您可以合并使用正向后查找:

(?<=\%)\s|\s(?=\d)

字符串

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


有关详细信息,请参阅regex101

ki1q1bka

ki1q1bka2#

可以使用以下正则表达式:/(\d+%)/g但是,这会导致输出数组包含一个或多个空字符串。我们可以使用.filter(Boolean)的一个巧妙技巧来摆脱这些。你可以在谷歌上搜索它到底是做什么的。
但还有第二个问题。正则表达式不会删除字符串周围的白色,因此您应该Map数组并在元素上使用.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());

字符串

5q4ezhmt

5q4ezhmt3#

而不是分裂你可以匹配正则表达式

\d+%|[a-z]+(?: [a-z]+)*

字符串
设置了以下标志:i(大小写无关)和g(“全局”,意味着在第一次匹配后不返回)。
Demo
正则表达式为“匹配一个或多个(+)数字(\d)或(|)匹配一个或多个字母([a-z]+),后跟一个或多个字母,前面有一个空格((?: [a-z]+)),零次或多次(*)。(?:...)表示非捕获组。

v1l68za4

v1l68za44#

由于普通文本和带有百分比的数字总是用空格分隔,我们可以简单地用空格分割字符串,并使用.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);

字符串

falq053o

falq053o5#

您可以使用捕获组来保留正在拆分的部分,并匹配可选的周围空白字符。

\s*\b(\d+%)\s*

字符串

  • \s*匹配可选的空白字符
  • \b防止部分字匹配的字边界
  • (\d+%)捕获组1,匹配1+数字和%
  • \s*匹配可选空格字符

请参见regex demo
然后从结果数组中删除空条目。
或者匹配字符串的开头或1+个空格字符,如果前后都没有空格字符,则匹配字符串的结尾或尾随空格字符

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


另见regex demo

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))


Regex demo

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

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

相关问题