首页 > 解决方案 > 正则表达式用破折号匹配未知字符

问题描述

我正在努力尝试解析以下字符组合:

我有两种类型的文本:

1. AF-B-W23F4-USLAMC-X99-JLK
2. LS-V-A23DF-SDLL--X22-LSM

我想在破折号内获得由 - 分隔的最后两个字符组合。

从 1.X99-JLK和从 2.X22-LSM

我用下面的正则表达式完成了 2.'--(.*-.*)'

如何解析 1. 样本,是否有任何选项可以使用 OR 运算符一次解析它?

谢谢你的帮助!

标签: regexparsing

解决方案


--(.*-.*)您尝试的模式与第二个示例匹配,因为它包含--并且匹配第一个匹配项。

然后它匹配直到字符串的末尾并回溯以找到另一个连字符。

由于.*可以匹配任何字符(也-)并且没有设置锚或边界,这是一个非常广泛的匹配。


如果必须有 2 个破折号,您可以匹配第一个破折号,并为使用否定字符类的第二个破折号的部分使用捕获组[^-]

字符类也可以匹配换行符。如果您不想匹配换行符,您可以使用[^-\r\n]或不匹配空格[^-\s](因为示例数据中没有空格)

-([^-]+-[^-]+)$

解释

  • -匹配-
  • (捕获组 1
    • [^-]+-[^-]+匹配字符之间的第二个破折号-
  • )关闭组 1
  • $字符串结束

查看正则表达式演示

例如使用 Javascript:

const regex = /-([^-]+-[^-]+)$/;
[
  "AF-B-W23F4-USLAMC-X99-JLK",
  "LS-V-A23DF-SDLL--X22-LSM"
].forEach(s => {
  const m = s.match(regex);
  if (m) {
    console.log(m[1]);
  }
})


推荐阅读