正则表达式以避免特定内容

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 匹配数字和单词边界以防止部分匹配

Regex demo

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