使用正则查找字符串中元素的最后一个索引并删除子字符串

Find last index of element in string with regular and remove substring

我有一个字符串数组。我正在使用常规我正在尝试查找元素出现的索引并从字符串中删除子字符串但是当我添加另一个出现的字符时我遇到了问题

我的解决方案:

const names = [
  'COMMENT — CODE | COUNTRY | DATE | TARGET',
  'CODE| COUNTRY | DATE |TARGET',
  'CODE|| COUNTRY| DATE |TARGET',
  'COMMENT 1 — COMMENT 2 — CODE | COUNTRY | DATE | TARGET',
];

const exp = new RegExp(/—|-/);

const filteredNames = names.map(name => {
  const index = name.match(exp)?.index;
  return name.slice(index + 1)
});

My result:

"CODE | COUNTRY | DATE | TARGET"
"CODE| COUNTRY | DATE |TARGET"
"CODE|| COUNTRY| DATE |TARGET"
"COMMENT 2 — CODE | COUNTRY | DATE | TARGET" <- not correct

但预期结果:

"CODE | COUNTRY | DATE | TARGET"
"CODE| COUNTRY | DATE |TARGET"
"CODE|| COUNTRY| DATE |TARGET"
"CODE | COUNTRY | DATE | TARGET"

如有任何帮助,我将不胜感激。

我们可以在这里尝试正则表达式替换方法:

var names = [
  'COMMENT — CODE | COUNTRY | DATE | TARGET',
  'CODE| COUNTRY | DATE |TARGET',
  'CODE|| COUNTRY| DATE |TARGET',
  'COMMENT 1 — COMMENT 2 — CODE | COUNTRY | DATE | TARGET',
];
var output = names.map(x => x.replace(/(?:.*? — )*([^ |]+)/g, ""));
console.log(output);

以下是对此处使用的正则表达式模式的解释:

(?:.*? — )*  match (but do not capture) a "TERM — ", zero or more times
([^ |]+)     then capture the final term in 

然后,我们将每个竖线分隔的条目替换为 ,最后一项。

您可以 select 您需要的部分:

const names = [
  'COMMENT — CODE | COUNTRY | DATE | TARGET',
  'CODE| COUNTRY | DATE |TARGET',
  'CODE|| COUNTRY| DATE |TARGET',
  'COMMENT 1 — COMMENT 2 — CODE | COUNTRY | DATE | TARGET',
];

const exp = new RegExp(/(\w+(\s*\|*\s*))*\w+\s*$/g);

const filteredNames = names.map(name => {
  const matches = name.match(exp);
  return matches?.[0] || '';
});

console.log(filteredNames);

要获取最后一个元素,您可以拆分任一类型的连字符并获取最后一部分:

const names = [
  'COMMENT — CODE | COUNTRY | DATE | TARGET',
  'CODE| COUNTRY | DATE |TARGET',
  'CODE|| COUNTRY| DATE |TARGET',
  'COMMENT 1 — COMMENT 2 — CODE | COUNTRY | DATE | TARGET',
];
const regex = /[—-]/;

names.forEach(s => {
  const parts = s.split(regex);
  console.log(parts[parts.length - 1].trim());
})

要获得更高性能的匹配,您可以使用可选的重复组:

\w+(?:\s*\|+\s*\w+\s*)*$

说明

  • \w+ 匹配 1+ 个单词字符
  • (?:非捕获组整体重复
    • \s*\|+\s*\w+\s* 在可选的 whitspace cars 之间匹配 1 个或多个管道和单词字符
  • )* 可选择重复
  • $ 字符串结束

看到一个regex demo

const names = [
  'COMMENT — CODE | COUNTRY | DATE | TARGET',
  'CODE| COUNTRY | DATE |TARGET',
  'CODE|| COUNTRY| DATE |TARGET',
  'COMMENT 1 — COMMENT 2 — CODE | COUNTRY | DATE | TARGET',
];
const regex = /\w+(?:\s*\|+\s*\w+\s*)*$/;

names.forEach(s => {
  const m = s.match(regex);
  if (m) {
    console.log(m[0])
  }
})