【问题标题】:Regex exclude trailing text from company names正则表达式从公司名称中排除尾随文本
【发布时间】:2020-04-25 07:11:33
【问题描述】:

目前

我尝试从具有 4 个条件的字符串中匹配有效的公司名称:

  1. 名称只能包含字母数字字符 + 空格 + 连字符
  2. 名称可以包含连字符(在名称内)
  3. 有些公司后缀应从公司名称中排除,即Pty LtdPty. Ltd.LimitedLtd
  4. 如果同一行还有其他匹配项,则排除这些匹配项

我想要达到的目标:

到目前为止我的正则表达式:

(?:\s|^)([a-zA-Z0-9]+[a-zA-Z0-9\s-]*?[a-zA-Z0-9]+)(?: Pty Ltd| Ltd(\.){0,1}| Limited){0,1}(?:\s|$)

问题

https://regex101.com/r/Gpbdln/4

我似乎在苦苦挣扎:

  1. 排除要忽略的后缀
  2. 使捕获包括公司名称的空格(同时排除后缀)

我已经坚持了一个多小时,希望能得到一些帮助。

【问题讨论】:

    标签: regex


    【解决方案1】:

    你可以使用

    ^[a-zA-Z0-9]+(?:[\s-]+[a-zA-Z0-9]+)*?(?=(?:\s+(?:(?:Pty\.?\s+)?Ltd\.?|Limited|[a-zA-Z0-9]*[^a-zA-Z0-9\s]).*)?$)
    

    regex demo

    如果您只需要获取不跨行的匹配项,请将\s 替换为\h[\p{Zs}\t](如果支持)或[^\S\r\n],以仅匹配水平空格。

    详情

    • ^ - 字符串开头
    • [a-zA-Z0-9]+ - 1+ ASCII 字母数字字符
    • (?:[\s-]+[a-zA-Z0-9]+)*? - 0 次或更多(但尽可能少)出现
      • [\s-]+ - 1+ 个空格或连字符
      • [a-zA-Z0-9]+ - 1+ ASCII 字母数字字符
    • (?=(?:\s+(?:(?:Pty\.?\s+)?Ltd\.?|Limited|[a-zA-Z0-9]*[^a-zA-Z0-9\s]).*)?$) - 紧靠右边,一定有
      • (?:\s+(?:(?:Pty\.?\s+)?Ltd\.?|Limited|[a-zA-Z0-9]*[^a-zA-Z0-9\s]).*)? - 一系列模式的可选出现:
        • \s+ - 1+ 个空格
        • (?:(?:Pty\.?\s+)?Ltd\.?|Limited|[a-zA-Z0-9]*[^a-zA-Z0-9\s]) - 任何一个
        • (?:Pty\.?\s+)?Ltd\.?| - Pty 的可选序列,可选的点,然后是 1+ 个空格,然后是 Ltd 字符串和可选的 . 字符,或
        • Limited| - Limited 字符串,或
        • [a-zA-Z0-9]*[^a-zA-Z0-9\s] - 任何 0 个或多个 ASCII 字母数字字符后跟除空格和字母数字字符以外的字符
        • .* - 字符串的其余部分
      • $ - 字符串结束。

    【讨论】:

    • 我展示的示例未能指定应该忽略的行上可能有其他文本。对不起。也“无视”。不是后缀模式,我试图证明应该忽略有效匹配后的附加文本。我感谢最初的建议和解释。
    • @Wronski 只需用(?=(?:\s+(?:(?:Pty\.?\s+)?Ltd\.?|Limited|[a-zA-Z0-9]*[^a-zA-Z0-9\s]).*)?$) 替换前瞻,我用解释和演示链接编辑了答案。
    • 我在期望的行为中犯了一个错误。第 10 行的A B C 应该已被捕获。你太棒了,这几乎就在那里。我什至可以自己完成它:)
    • @Wronski 恐怕这不符合所有其他匹配逻辑。
    • 谢谢。我想我有足够的时间来解决极端情况。这太棒了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多