【发布时间】:2020-02-16 21:16:34
【问题描述】:
我正在尝试实现一个正则表达式来解析不同的字符串组。提供给我的字符串表示一位客户想要将我们平台上的主要语言从 X 更改为 Y,所以它看起来像
language_change__from_english_to_spanishlanguage_change__from_spanish_to_somalilanguage_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