我怎么能把这串分开
进入
再生尼龙41%尼龙百分之十七弹性纤维 *(with regex?我已经试过使用.split(/\s(?=\d)/)但这会将字符串变成这样:
41%尼龙17%弹性纤维 *谢谢你的好意
p5fdfcr11#
你已经在使用正向前瞻;您可以合并使用正向后查找:
(?<=\%)\s|\s(?=\d)
字符串
var s = "42% recycled nylon 41% nylon 17% elastane"; console.log(s.split(/(?<=\%)\s|\s(?=\d)/g))
型有关详细信息,请参阅regex101
ki1q1bka2#
可以使用以下正则表达式:/(\d+%)/g但是,这会导致输出数组包含一个或多个空字符串。我们可以使用.filter(Boolean)的一个巧妙技巧来摆脱这些。你可以在谷歌上搜索它到底是做什么的。但还有第二个问题。正则表达式不会删除字符串周围的白色,因此您应该Map数组并在元素上使用.trim()。所以,你的最终脚本应该是这样的:
/(\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());
5q4ezhmt3#
而不是分裂你可以匹配正则表达式
\d+%|[a-z]+(?: [a-z]+)*
字符串设置了以下标志:i(大小写无关)和g(“全局”,意味着在第一次匹配后不返回)。Demo正则表达式为“匹配一个或多个(+)数字(\d)或(|)匹配一个或多个字母([a-z]+),后跟一个或多个字母,前面有一个空格((?: [a-z]+)),零次或多次(*)。(?:...)表示非捕获组。
i
g
+
\d
|
[a-z]+
(?: [a-z]+)
*
(?:...)
v1l68za44#
由于普通文本和带有百分比的数字总是用空格分隔,我们可以简单地用空格分割字符串,并使用.map()和.filter()的组合粘合不是带有百分比的数字的邻居:
.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);
falq053o5#
您可以使用捕获组来保留正在拆分的部分,并匹配可选的周围空白字符。
\s*\b(\d+%)\s*
\s*
\b
(\d+%)
%
请参见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));
型
5条答案
按热度按时间p5fdfcr11#
你已经在使用正向前瞻;您可以合并使用正向后查找:
字符串
型
有关详细信息,请参阅regex101
ki1q1bka2#
可以使用以下正则表达式:
/(\d+%)/g
但是,这会导致输出数组包含一个或多个空字符串。我们可以使用.filter(Boolean)
的一个巧妙技巧来摆脱这些。你可以在谷歌上搜索它到底是做什么的。但还有第二个问题。正则表达式不会删除字符串周围的白色,因此您应该Map数组并在元素上使用
.trim()
。所以,你的最终脚本应该是这样的:字符串
5q4ezhmt3#
而不是分裂你可以匹配正则表达式
字符串
设置了以下标志:
i
(大小写无关)和g
(“全局”,意味着在第一次匹配后不返回)。Demo
正则表达式为“匹配一个或多个(
+
)数字(\d
)或(|
)匹配一个或多个字母([a-z]+
),后跟一个或多个字母,前面有一个空格((?: [a-z]+)
),零次或多次(*
)。(?:...)
表示非捕获组。v1l68za44#
由于普通文本和带有百分比的数字总是用空格分隔,我们可以简单地用空格分割字符串,并使用
.map()
和.filter()
的组合粘合不是带有百分比的数字的邻居:字符串
falq053o5#
您可以使用捕获组来保留正在拆分的部分,并匹配可选的周围空白字符。
字符串
\s*
匹配可选的空白字符\b
防止部分字匹配的字边界(\d+%)
捕获组1,匹配1+数字和%
\s*
匹配可选空格字符请参见regex demo。
然后从结果数组中删除空条目。
或者匹配字符串的开头或1+个空格字符,如果前后都没有空格字符,则匹配字符串的结尾或尾随空格字符
型
另见regex demo。
型
分割空格字符,其中左边或右边有1+数字和%,并带有前导或尾随空格边界:
型
Regex demo的
型