【问题标题】:Regex: Capture name and department separately正则表达式:分别捕获名称和部门
【发布时间】:2020-02-17 10:25:03
【问题描述】:

给定文本字符串,如

Assigned to: Hon Keith Davis Dept: S25
Assigned for All Purposes to: Hon. Howard Halm, Dept. 93
Judge Randolph M. Hammock Dept. 93
HONORABLE JOANNE B. O'DONNELL
Honorable Michael S. Williams
Judge:            Hon. Yolanda Orozco

我想获取法官的姓名,以及他们来自的部门(如果有的话)。

这是我迄今为止想出的仅捕获名称的方法:

(?i)(?:(?:Hon(?:orable)?|Judge)(?:[:\. ]+))+((?-i)[A-Z][A-Za-z. '-]{3,})

问题是对于第一个和第三个字符串,Dept 部分被捕获,所以我得到Keith Davis DeptRandolph M. Hammock Dept

当我尝试通过附加来添加第二个捕获组时

[, ]+(?:(?:Dept)[\.: ]+([A-Z0-9]+))?

对于上述正则表达式,它适用于前 2 个字符串,但不适用于其余字符串。

如何从第一个捕获组中排除Dept,并使用第二个捕获组获取部门名称/编号?

当前正则表达式和示例:https://regexr.com/4n85p

【问题讨论】:

  • 或许可以这样尝试(?i)(?:(?:Hon(?:orable)?|Judge)(?:[:\. ]+))+((?-i)[A-Z][A-Za-z. '-]{3}(?:(?![,]? Dept\b).)+)regex101.com/r/iSaqeQ/1
  • (?i)(?:(?:Hon(?:orable)?|Judge)[:. ]+)+((?-i)[A-Z][A-Za-z. '-]{3,})(?:[, ]+Dept[.: ]+([A-Z0-9]+))?$, demo.
  • @WiktorStribiżew 不错,比我的表现更好。
  • @WiktorStribiżew 谢谢!如果你添加你的答案,我很乐意接受它
  • @Thefourthbird wiktor 的正则表达式几乎需要半步 :),这是由于您的模式中的负前瞻,对吗?

标签: regex


【解决方案1】:

你可以使用

(?i)(?:(?:Hon(?:orable)?|Judge)[:. ]+)+((?-i)[A-Z][A-Za-z. '-]{3,})(?:[, ]+Dept[.: ]+([A-Z0-9]+))?$

regex demo

详情

  • (?i) - 关闭区分大小写
  • (?:(?:Hon(?:orable)?|Judge)[:. ]+)+ - HonHonorableJudge 出现 1+ 次,后跟 1+ 次冒号、点、空格
  • ((?-i)[A-Z][A-Za-z. '-]{3,}) - 第 1 组:
    • (?-i) - 区分大小写
    • [A-Z] - 大写字母
    • [A-Za-z. '-]{3,} - 3 个或更多 ASCII 字母、点、空格、撇号或连字符
  • (?:[, ]+Dept[.: ]+([A-Z0-9]+))? - 一个可选的非捕获组,匹配 1 次或 0 次出现:
    • [, ]+ - 1+ 逗号或空格
    • Dept - 文字文本
    • [.: ]+ - 1+ 个点、冒号或空格
    • ([A-Z0-9]+) - 第 2 组:1+ 大写字母或数字
  • $ - 字符串结束。

更多提示:

  • 如果您只想从整个单词开始匹配,请在(?i)之后添加\b
  • 要匹配任何空格,请将文字空格替换为 \s(或 \h - 如果支持 - 以仅匹配水平空格)。

【讨论】:

    【解决方案2】:
    .*(?:(?:H[Oo][nN](?:[oO][a-zA-Z]+(?:[^.])?)?)|(?:Judge:?))\.?\s*([a-zA-Z .']+),?\s*(?:Dept[:.]\s*([a-zA-Z0-9]+))?\n
    

    请在您的link中尝试上述表达式

    .*(?:(?:H[Oo][nN](?:[oO][a-zA-Z]+(?:[^.])?)?)|(?:Judge:?))\.?\s*(?<judge_name>[a-zA-Z .']+),?\s*(?:Dept[:.]\s*(?<department>[a-zA-Z0-9]+))?\n
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      相关资源
      最近更新 更多