【问题标题】:Regex for underscore delimited table names with optional underscores带有可选下划线的下划线分隔表名的正则表达式
【发布时间】:2021-04-01 14:12:17
【问题描述】:

我需要从多个下划线分隔的表名中提取名称,它们总是以 3 位字母代码结尾,并且可以选择具有下划线分隔的 32 字符 GUID。可选地,表名本身可以有下划线

例如

String Expected Output
TableName_d835b913bdab4fed861805f26ce6c953_abc TableName
TableName_abc TableName
Table_Name_abc Table_Name

我可以使用正则表达式

(^[a-zA-Z0-9]+)_?([a-zA-Z0-9]{32})?(_[a-z]{3})

这适用于前 2 个示例,但不适用于最后一个。

使用

(^[a-zA-Z0-9_]+)_?([a-zA-Z0-9]{32})?(_[a-z]{3})

第一个示例中的结果包括输出中的 GUID。我尝试了前瞻选项,但这些选项似乎在这里不起作用,因为我想根据以下字符串包含或排除一些捕获组。

非常感谢任何帮助。

【问题讨论】:

    标签: regex


    【解决方案1】:

    您可以选择匹配下划线和 32 个字符的字符串,如果表名可以包含双下划线并且也以下划线结尾,请使用允许匹配下划线的非贪婪字符类。

    ^([a-zA-Z0-9][a-zA-Z0-9_]+?)(?:_[a-zA-Z0-9]{32})?_[a-z]{3}$
    

    Regex demo

    如果表名不能有连续的下划线,并且不能以下划线结尾,则可以使用可选的下划线开头的惰性重复组。

    ^([a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)*?)(?:_[a-zA-Z0-9]{32})?_[a-z]{3}$
    

    Regex demo

    【讨论】:

      【解决方案2】:

      非常简单的添加是使用惰性量词(注意第一个捕获组末尾的附加 ?):

      (^[a-zA-Z0-9_]+?)_?([a-zA-Z0-9]{32})?(_[a-z]{3})
      

      默认情况下,量词是贪婪的(例如[a-zA-Z0-9_]+,其中+ 是量词),这意味着它们会尝试尽可能多地匹配。在这种情况下,第一个捕获组 ((^[a-zA-Z0-9_]+?)) 和它之后的符号 (_?) 都在寻找下划线。然而,由于第一个捕获组中有一个贪婪的量词,它会继续消耗,而不考虑为它的邻居留下任何东西,直到找不到匹配项。这意味着_? 永远不会收到它的下划线。

      另一方面,惰性量词(例如[a-zA-Z0-9_]+?)以相反的方式工作。在第一次匹配之后,它总是将字符串“放弃”到正则表达式的下一部分,从而有效地允许其邻居在它之前尝试找到匹配项。这就是为什么这样做的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多