【问题标题】:Regex for picking word with atleast two underscores用于选择带有至少两个下划线的单词的正则表达式
【发布时间】:2020-07-03 06:34:58
【问题描述】:

我正在尝试解析包含一些带下划线的单词的文本文档。

我正在寻找正则表达式匹配,但目前失败了。

我正在查看(逐行)获取具有至少两个下划线的单词或具有至少两个下划线和正斜杠 + 至少三个数字的单词。

我已经到了

([a-zA-Z]+(?:_{2,}[a-zA-Z]+)*)

正确的匹配示例是

VOK17_05_530_526002 *(has atleast than two underscores)*
VIE_ROMS_002 *(has atleast than two underscores)*
VOK_OVSZ_001/002 *(has atleast  two underscores and a forward slash + three digits)*

输入样本

VOK17_05_530_526002 502 504 BACU VIE_ROMS_002 VIE_ROMS_001 VOK_OVSZ_001/002
VOK17_05_530_526002 401 401 LGCU VIE_ROMS_002 VIE_ROMS_001 VOK_OVSZ_001/002
VOK17_05_530_526002 510 513 BACU VIE_ROMS_002 VIE_ROMS_001 VOK_OVSZ_001/002
VOK17_05_530_526002 515 515 BACU VIE_ROMS_002 VIE_ROMS_001 VOK_OVSZ_001/002
VOK17_05_530_526003 503 506 BACU VIE_ROMS_002 VIE_ROMS_001 VOK_OVSZ_001/002

我正在尝试我的正则表达式@https://regex101.com/r/yToVtc/1

如果有人可以在这里提供帮助,我将不胜感激。

【问题讨论】:

    标签: regex


    【解决方案1】:

    你可以使用

    \b[A-Za-z0-9]+(?:_[a-zA-Z0-9]+)+(?:_[0-9]{3,})+(?:_[a-zA-Z0-9]+)*(?:/[0-9]+)?\b
    

    部分

    • \b字边界
    • [A-Za-z0-9]+ 匹配 1 次以上列出的任何一项
    • (?:_[a-zA-Z0-9]+)+ 重复 1+ 次下划线和 1+ 次任何列出的内容
    • (?:_[0-9]{3,})+ 至少匹配第二个下划线和 3 个或更多数字
    • (?:_[a-zA-Z0-9]+)* 重复 0 次以上并加下划线和任何列出的
    • (?:/[0-9]+)? 匹配可选的 / 和 1+ 位
    • \b字边界

    Regex demo

    【讨论】:

      【解决方案2】:

      使用这个:

      \b[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+){2,}(?:/\d{3})?\b
      

      说明:

      \b                  # word boundary
      [a-zA-Z0-9]+        # 1 or more alphanum
      (?:                 # non capture group
        _                 # underscore
        [a-zA-Z0-9]+      # 1 or more alphanum
      ){2,}               # end group, must appear 2 or more times
      (?:                 # non capture group
        /                 # a slask
        \d{3}             # 3 digits
      )?                  # end group, optional
      \b                  # word boundary
      

      demo

      【讨论】:

        【解决方案3】:

        至少有两个下划线的文本字符串的正则表达式

        ^[^_]*_[^_]*_.*$
        
        • ^ - 比赛开始
        • [^_]* 然后零到任意数量的非下划线字符
        • _ 然后是下划线
        • [^_]* 然后零到任意数量的非下划线字符
        • _ 然后是下划线
        • .* 然后零到任意数量的字符
        • $ - 比赛结束

        【讨论】:

          【解决方案4】:

          下面的正则表达式使用 lookahead assertion 来简化问题:

          \b(?=(?:([A-Za-z0-9]*_){2}))[A-Za-z0-9_]+(?:\/\d{3,})?\b
          
          1. \b(?=(?:([A-Za-z0-9]*_){2})) 匹配单词边界当且仅当后面跟着([A-Za-z0-9]*_){2},也就是说,一个包含 0 个或多个合法字母数字字符后跟一个“_”的字符串,全部重复两次。这是确保我们在下面第 2 步中的匹配项至少包含两个下划线字符的前瞻断言。
          2. [A-Za-z0-9_]+ 匹配合法字符一次或多次。
          3. (?:\/\d{3,})? 一个可选的正斜杠,后跟 3 个或更多数字。
          4. \b 匹配单词边界。

          See demo

          【讨论】:

            【解决方案5】:

            ([^\s]*_[^\s]*){2,} 将匹配包含至少两个下划线的任何单词(任何不带空格的字符串),方法是查找任意数量的非空格、一个下划线和多个“单词”符号的连续组。

            您可以将[^\s]* 替换为您喜欢的任何“单词”定义。

            您还可以在第一个括号后添加?: 以避免捕获组。

            【讨论】:

              猜你喜欢
              • 2018-04-10
              • 2013-06-14
              • 1970-01-01
              • 1970-01-01
              • 2017-10-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-19
              • 1970-01-01
              相关资源
              最近更新 更多