【问题标题】:Non-greedy capture groups in PostgresPostgres 中的非贪婪捕获组
【发布时间】:2020-02-16 21:16:34
【问题描述】:

我正在尝试实现一个正则表达式来解析不同的字符串组。提供给我的字符串表示一位客户想要将我们平台上的主要语言从 X 更改为 Y,所以它看起来像

  • language_change__from_english_to_spanish
  • language_change__from_spanish_to_somali
  • language_change__from_simplified_chinese_to_english

我有一个正则表达式来解析语言(原始语言,然后是新语言):

SUBSTRING(language_field FROM '^language_change__([a-zA-Z_]+)_to_[a-zA-Z_]+$')

对原始语言效果很好,但对新语言效果不佳,因为有时人们输入了language_change__from_english_to_spanish_。所以实际解析的是spanish_,而不是spanish

我知道我可以轻松地将我的SUBSTRING(...) 包装为REPLACE 以替换最终的_,但我正在尝试找到一种方法来使用正则表达式来提高我的正则表达式技能。我基本上想忽略最后的_。但是,我无法从我的捕获组中删除_,因为我们系统中编码的某些语言有_:例如simplified_chinese

基本上,我希望我的捕获组包含第一个_,后跟文本(如simplified_chinese),但如果_位于字符串末尾(english_),则不要包含它。

所以当输入language_change__from_spanish_to_english_ 时,我仍然应该捕获english,而不是english_ 作为语言。

我尝试了各种方法:

  • 使用负前瞻SUBSTRING(language_field FROM '^language_change__[a-zA-Z_]+_to_([a-zA-Z_]+)(?!_)$')
  • 使用非贪婪捕获组SUBSTRING(language_field FROM '^language_change__[a-zA-Z_]+_to_([a-zA-Z_]+?)$')
  • 使用负前瞻和非贪婪捕获组的组合SUBSTRING(language_field FROM '^language_change__[a-zA-Z_]+_to_([a-zA-Z_]+?)(?!_)$')

我觉得我已经在 StackOverflow 上待了足够长的时间,不能说“没有任何效果”,但是当人们错误地输入 language_change__from_spanish_to_english_ 时,我上面尝试的所有三件事仍然产生 english_ 而不是 english .

有人可以指点我缺少什么吗?

【问题讨论】:

    标签: regex postgresql regex-lookarounds regex-greedy


    【解决方案1】:

    你可以使用

    SUBSTRING(language_field FROM '^language_change__[a-zA-Z_]+_to_([a-zA-Z_]+?)_*$')
    

    ([a-zA-Z_]+?)_*$ 部分表示:

    • ([a-zA-Z_]+?) - 第 1 组:尽可能少匹配 1 个或多个 ASCII 字母或 _
    • _* - 匹配 0 个或更多 _ 字符
    • $ - 在字符串的末尾。

    ([a-zA-Z_]+?) 模式将匹配 1 个字符,然后将尝试 _*$ 模式部分。如果_*$ 匹配失败,引擎将回溯,([a-zA-Z_]+?) 模式将获取另一个字符并重复测试。因此,如果_s 存在于字符串的末尾,则它们不会被包含在捕获组中,它们将与_* 部分匹配,从而从结果中丢弃。

    请参阅this regex debugger step by step 以查看正在运行的正则表达式。

    【讨论】:

    • 这行得通!哇谢谢你。只是为了让我学习,你能简单地解释一下你是如何解决这个问题的,以便我将来可以使用你同样的思维过程吗? IE。我知道你解释了每个部分的含义,但是你是怎么知道这个问题需要使用_* 的?
    • 我会在 10 分钟内接受答案(当我允许的时候)
    猜你喜欢
    • 2023-04-06
    • 2019-05-19
    • 2021-08-19
    • 2022-09-28
    • 1970-01-01
    • 2020-03-15
    • 2011-08-25
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多