用于查找字母字符的前 x 个出现的正则表达式,忽略其他所有内容

Posted

技术标签:

【中文标题】用于查找字母字符的前 x 个出现的正则表达式,忽略其他所有内容【英文标题】:Regex for finding first x occurrences of alphabetical characters, ignoring everything else 【发布时间】:2020-08-03 14:16:29 【问题描述】:

我正在尝试编写一个正则表达式来匹配字符串中出现的前 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 中使用 Regex 引擎

测试:


    USUK

应该完全匹配US


    123U456 KUS

应该完全匹配UK


    []() [][(UK]) ( ) [ ] US

应该完全匹配UK


    ]-u K[

应该完全匹配uK


感谢您花时间帮助我。

【问题讨论】:

您可以使用 2 个捕获组并匹配 \b([a-zA-Z])\s*([a-zA-Z]) regex101.com/r/e18y4F/1 之间的空白字符,或者仅匹配并删除 \b[a-zA-Z]\s*[a-zA-Z] regex101.com/r/SXDPnQ/1 之后的空白字符,注意没有 UKKUS 是不是打错字了? @Thefourthbird 在测试#2 中的数字中有一个“U”。它应该得到那个和来自KUS的K 【参考方案1】:

你可以使用

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

见regex demo

详情

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

【讨论】:

这对于我想要实现的目标来说似乎很长,但它似乎可以解决问题!非常感谢您的帮助。【参考方案2】:

我认为下面的方法更清晰,更容易理解

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

在上面 - 您首先通过用空字符串替换所有非字母字符来简单地消除它们 然后你只需要前两个字符

【讨论】:

我提供了这个答案作为您对 Wiktor 其他出色答案的... seems very long for what I am trying to achieve ... 评论的跟进

以上是关于用于查找字母字符的前 x 个出现的正则表达式,忽略其他所有内容的主要内容,如果未能解决你的问题,请参考以下文章

js 正则获取匹配部分最后一个内容

正则表达式工具(上)

05正则表达式

关于正则表达式

用于匹配 JSON 子字符串某些部分的 Java 正则表达式

在js中正则表达式如何判断用户输入的内容只能是数字和字母