【问题标题】:Regex Optional Capture Groups正则表达式可选捕获组
【发布时间】:2017-09-18 07:34:25
【问题描述】:

问题是匹配下面的内容

现代 E&C Hillstate (KOR) - 兴国人寿保险粉蜘蛛 (韩国)

目前,捕获组已经部分工作,虽然它会在有时停止

.*

当前的正则表达式为:

  (hyundai){0,1}\s*(E&C){0,1}\s*(hillstate){0,1}.*(Heungkuk){0,1}.*(invalid){0,1}.*`

请假设忽略大小写已到位。有了上面,它会像这样匹配

第 1 组长度:7 现代

第 2 组长度:3 工程建设

第 3 组长度:9 山州

第 4 组长度:0

第 5 组长度:0

任何建议将不胜感激。

另一种情况是

  1. 现代 E&C Hillstate (KOR) v Heungkuk life insurance pink spiders (KOR)
  2. 现代 E&C Hillstate 诉 Heungkuk 人寿保险粉蜘蛛
  3. 现代E&C Hillstate-兴国人寿保险粉蜘蛛

问题是,在我这边,我们有类似现代 E&C Hillstate v Heungkuk 之类的东西,然后它被分解成碎片。

然后将这些部件与由第三方提供的字符串进行比较,例如现代 E&C Hillstate (KOR) - Heungkuk life insurance pink spiders (KOR)。在这种情况下,将指出它是否匹配。

【问题讨论】:

  • 第一个 .* 之后的所有内容都是可选的。因此,最喜欢的比赛将把所有东西都放入贪婪的.*。让你的正则表达式“更紧密”。
  • @Yunnosch OP 确实说匹配不区分大小写
  • 请注意,{0,1} 可以缩短为 ?
  • 所有正则表达式部分都是可选的。这不是一个好主意。为什么不使用 if (s.IndexOf("hyundai", StringComparison.OrdinalIgnoreCase) >=0) { /*hyundai is found!*/ } ... 并将代码用于其他子字符串?你在这里的最终目标是什么?由于您没有匹配整个单词,因此使用正则表达式似乎不合适,特别是如果您只是检查子字符串是否存在。
  • 你所有的例子都以hyundai E&C Hillstate开头,没有一个包含invalid。那么为什么您的正则表达式允许 hyundaiE&CHillstate 是可选的?为什么你的正则表达式包含invalid

标签: c# regex regex-group


【解决方案1】:

类似这样的: (hyundai){0,1}\s*(E&C){0,1}\s*(hillstate){0,1}\s*(\(KOR\)){0,1}\s*\W\s*(Heungkuk){0,1}(.*)

【讨论】:

  • 在模式中添加国家与将(Heungkuk) 转换为所需的字符串一样任意。这也行
  • 我不想匹配 (KOR)。此外,我添加了“无效”,因为可能会添加无效的搜索词,
  • 好吧,你必须对“(KOR)”部分做点什么。您可以通过在组前加上 ?: 将其变为非捕获组,并通过将 KOR 替换为 \w{3} 使其与国家/地区无关,但您不能忽略该部分。所以,你最终会得到这样的结果:(hyundai){0,1}\s*(E&C){0,1}\s*(hillstate){0,1}\s*(?:\(\w{3}\)){0,1}\s*\W\s*(Heungkuk){0,1}(.*)
  • 问题是我不知道 KOR 部分,因为它并不总是存在。
  • 如果它不存在,它不会是一个问题。如果缺少上面的 cmets 正则表达式,它将忽略它 - 请注意它后面的 {0,1}。但是,如果它存在,则必须明确忽略它,以便跳过将其包含在后续捕获组中。
【解决方案2】:

您正在寻找的似乎是命名捕获组。语法是

(((?<hy>hyundai)|(?<Korea>\(KOR\))|(?<delimiter>(v|-))|(?<heung>Heungkuk)|(?<invalid>\S+?))(\s+|$))+

然后检查捕获组可以告诉您该行中是否包含一个单词,并告诉您它的位置以及捕获它的组的名称。

请注意,并非所有关键字都包含在上述内容中。

您还可以考虑将(?&lt;hy&gt;hyundai)|(?&lt;Korea&gt;\(KOR\)) 更改为(?&lt;hy&gt;hyundai( (?&lt;hy-country&gt;\(KOR\)))?) 以确保(KOR) 令牌不会单独出现。

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多