正则表达式匹配未知字符,中间有破折号

标签 regex parsing

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

我有两种类型的文本:

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

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

来自 1. X99-JLK 和 2. X22-LSM

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

我如何解析 1. 示例,是否有任何选项可以使用 OR 运算符等一次性解析它?

感谢您的帮助!

最佳答案

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

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

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


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

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

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

说明

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

查看regex demo

例如使用 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]);
  }
})

关于正则表达式匹配未知字符,中间有破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68643129/

相关文章:

python - 如何从正则表达式中排除某些可能性?

regex - 生成最佳的正则表达式匹配

http - 具有无效上下文的已知 HTTP header

python - 使用 % 进行 For 循环解析

java - 如何从 Java 文本文件中解析像 "1.8400e-016"这样的数字?

java - 序言中不能有内容

mysql - 在mysql中使用REGEX进行搜索和替换

php - Rust regex replace_all 比 PHP regex preg_replace_callback 慢,如何优化?

regex - r? .在scala中的含义

python - 可选的结束符号和使用正则表达式捕获的几个单词