首页 > 解决方案 > 用于查找字母字符的前 x 个出现的正则表达式,忽略其他所有内容

问题描述

我正在尝试编写一个正则表达式来匹配字符串中出现的前 2 个字母字符。到目前为止,我还没有达到我想要的结果。

到目前为止,我所做的尝试主要包括尝试对任何匹配A-Za-z的 ,\w等进行分组,但每次尝试时,我要么抓住括号、方括号,要么由于两个字母字符之间的空格或符号而被停止。

我不关心字符以外的任何东西,我可以很容易地编写代码,但我真的很想学习如何使用正则表达式来做到这一点。

我的尝试:

[(A-Za-z)]{2}- 失败,因为它包含()并且(U出于某种我无法弄清楚的原因。

[A-z].*[A-z]- 匹配字符之间的所有内容

[A-z]?[A-z]- 似乎捕捉到了我想要的一些东西,但不幸的是,在测试#2 中也捕捉到了括号和一些奇怪的行为。

[A-Za-z]{2}- 捕捉前两个连接的字母字符,但错过任何包含其间的任何内容。

[A-Za-z](?:)[A-Za-z]- 捕获连接的字母字符,但不捕获拆分的字符。

我认为我的主要问题是我不知道如何让正则表达式忽略两个字母符号之间的任何内容,而不将它们包括在我的匹配中。

我浏览了 wiki、regex101、regexone、regexr、regular-expressions.info 和参考,但我似乎根本无法弄清楚如何做到这一点。我在 Google 的 BigQuery 中使用正则表达式引擎

测试:


  1. USUK

应该完全匹配US


  1. 123U456 KUS

应该完全匹配UK


  1. []() [][(UK]) ( ) [ ] US

应该完全匹配UK


  1. ]-u K[

应该完全匹配uK


感谢您花时间帮助我。

标签: regexgoogle-bigquery

解决方案


您可以使用

REGEXP_REPLACE(col, r'^[^A-Za-z]*([A-Za-z])[^A-Za-z]*([A-Za-z]).*', r'\1\2')

查看正则表达式演示

细节

  • ^- 字符串的开始
  • [^A-Za-z]*- 0 个或更多字符而不是 ASCII 字母
  • ([A-Za-z])- 第 1 组 ( \1):一个 ASCII 字母
  • [^A-Za-z]*- 0 个或更多字符而不是 ASCII 字母
  • ([A-Za-z])- 第 2 组 ( \2):一个 ASCII 字母
  • .*- 字符串的其余部分。

推荐阅读