正则表达式以避免特定内容
Regex to avoid specific content
我有一个像 23DGERA@SPK_20W L+R FA-2@1+342HSHC@CPU_8PIN INTEL_TEST!@1+2356GHMX@SSD_256G MICRON_CONTENT@2 + blablabla
.
这样的字符串
我想做的是将字符串拆分为 +
,但在 SPK 部分有一个 L+R 会中断该过程。有没有REGEX可以实现我想要的?
结果应该是:
23DGERA@SPK_20W L+R FA-2@1
342HSHC@CPU_8PIN INTEL_TEST!@2
2356GHMX@SSD_256G MICRON_CONTENT@2
现在我总是得到:
23DGERA@SPK_20W L
R FA-2@1
342HSHC@CPU_8PIN INTEL_TEST!@2
2356GHMX@SSD_256G MICRON_CONTENT@2
我现在正在使用 Javascript .split('+')
。
我们将不胜感激。
您可以使用匹配的正则表达式解决方案:
text.match(/(?:L\+R|[^+])+/g)
见regex demo。 详情:
(?:
- 非捕获组的开始:
L\+R
- L+R
字符串
|
- 或
[^+]
- +
以外的任何字符
)+
- 组结束,出现一次或多次。
查看 JavaScript 演示:
var text = '23DGERA@SPK_20W L+R FA-2@1+342HSHC@CPU_8PIN INTEL_TEST!@1+2356GHMX@SSD_256G MICRON_CONTENT@2';
console.log(text.match(/(?:L\+R|[^+])+/g));
ECMAScript 2018+ 兼容解决方案
如果您想迁移到更现代的 ECMAScript 风格,可以使用
text.split(/\+(?<!L\+(?=R))/)
这将匹配不属于 L+R
字符串的 +
。
const text = '23DGERA@SPK_20W L+R FA-2@1+342HSHC@CPU_8PIN INTEL_TEST!@1+2356GHMX@SSD_256G MICRON_CONTENT@2';
console.log(text.split(/\+(?<!L\+(?=R))/));
参见regex demo。
该字符串看起来像一个零件列表,每个零件都有一个数量,例如@1
。您可以使用它来识别要拆分的正确 +
个字符。
使用包含 @\d+
-> (?<=@\d+)
后跟您要匹配的字符(转义,因为 +
具有特殊含义)的回溯得到:
(?<=@\d+)\+
在代码中使用它,我们还需要指定 g
修饰符来匹配所有实例,而不仅仅是第一个实例。
const str = '23DGERA@SPK_20W L+R FA-2@1+342HSHC@CPU_8PIN INTEL_TEST!@1+2356GHMX@SSD_256G MICRON_CONTENT@2'
const items = str.split(/(?<=@\d+)\+/g);
console.log(items);
您可以匹配示例数据中的格式,而不是拆分 +
。
首先匹配包含单个@的部分,然后匹配直到第一次出现 @
后跟一个数字。
注意 第二场比赛将是 342HSHC@CPU_8PIN INTEL_TEST!@1
而不是 342HSHC@CPU_8PIN INTEL_TEST!@2
\w+@\w+ [^@]*@\d\b
模式匹配:
\w+@\w+
匹配1+个单词字符,@
和1+个单词字符
[^@]*@
匹配 space,除 @
之外的可选字符,然后匹配 @
\d\b
匹配数字和单词边界以防止部分匹配
const s = "23DGERA@SPK_20W L+R FA-2@1+342HSHC@CPU_8PIN INTEL_TEST!@1+2356GHMX@SSD_256G MICRON_CONTENT@2 + blablabla";
const regex = /\w+@\w+ [^@]*@\d\b/g;
console.log(s.match(regex));
我有一个像 23DGERA@SPK_20W L+R FA-2@1+342HSHC@CPU_8PIN INTEL_TEST!@1+2356GHMX@SSD_256G MICRON_CONTENT@2 + blablabla
.
我想做的是将字符串拆分为 +
,但在 SPK 部分有一个 L+R 会中断该过程。有没有REGEX可以实现我想要的?
结果应该是:
23DGERA@SPK_20W L+R FA-2@1
342HSHC@CPU_8PIN INTEL_TEST!@2
2356GHMX@SSD_256G MICRON_CONTENT@2
现在我总是得到:
23DGERA@SPK_20W L
R FA-2@1
342HSHC@CPU_8PIN INTEL_TEST!@2
2356GHMX@SSD_256G MICRON_CONTENT@2
我现在正在使用 Javascript .split('+')
。
我们将不胜感激。
您可以使用匹配的正则表达式解决方案:
text.match(/(?:L\+R|[^+])+/g)
见regex demo。 详情:
(?:
- 非捕获组的开始:L\+R
-L+R
字符串|
- 或[^+]
-+
以外的任何字符
)+
- 组结束,出现一次或多次。
查看 JavaScript 演示:
var text = '23DGERA@SPK_20W L+R FA-2@1+342HSHC@CPU_8PIN INTEL_TEST!@1+2356GHMX@SSD_256G MICRON_CONTENT@2';
console.log(text.match(/(?:L\+R|[^+])+/g));
ECMAScript 2018+ 兼容解决方案
如果您想迁移到更现代的 ECMAScript 风格,可以使用
text.split(/\+(?<!L\+(?=R))/)
这将匹配不属于 L+R
字符串的 +
。
const text = '23DGERA@SPK_20W L+R FA-2@1+342HSHC@CPU_8PIN INTEL_TEST!@1+2356GHMX@SSD_256G MICRON_CONTENT@2';
console.log(text.split(/\+(?<!L\+(?=R))/));
参见regex demo。
该字符串看起来像一个零件列表,每个零件都有一个数量,例如@1
。您可以使用它来识别要拆分的正确 +
个字符。
使用包含 @\d+
-> (?<=@\d+)
后跟您要匹配的字符(转义,因为 +
具有特殊含义)的回溯得到:
(?<=@\d+)\+
在代码中使用它,我们还需要指定 g
修饰符来匹配所有实例,而不仅仅是第一个实例。
const str = '23DGERA@SPK_20W L+R FA-2@1+342HSHC@CPU_8PIN INTEL_TEST!@1+2356GHMX@SSD_256G MICRON_CONTENT@2'
const items = str.split(/(?<=@\d+)\+/g);
console.log(items);
您可以匹配示例数据中的格式,而不是拆分 +
。
首先匹配包含单个@的部分,然后匹配直到第一次出现 @
后跟一个数字。
注意 第二场比赛将是 342HSHC@CPU_8PIN INTEL_TEST!@1
而不是 342HSHC@CPU_8PIN INTEL_TEST!@2
\w+@\w+ [^@]*@\d\b
模式匹配:
\w+@\w+
匹配1+个单词字符,@
和1+个单词字符[^@]*@
匹配 space,除@
之外的可选字符,然后匹配@
\d\b
匹配数字和单词边界以防止部分匹配
const s = "23DGERA@SPK_20W L+R FA-2@1+342HSHC@CPU_8PIN INTEL_TEST!@1+2356GHMX@SSD_256G MICRON_CONTENT@2 + blablabla";
const regex = /\w+@\w+ [^@]*@\d\b/g;
console.log(s.match(regex));