【问题标题】:How to find a string with specified length that has specified letter?如何找到具有指定字母的指定长度的字符串?
【发布时间】:2015-11-30 08:41:57
【问题描述】:

所以,我知道如何查找指定长度的字符串以及如何查找指定字母的字符串。但是我怎样才能找到一个匹配这两个条件的字符串?
例如,我想找到一个包含字母“g”的 4 个字母的字符串。
我做了什么:
\b[A-Za-z].[Gg][A-Za-z].\b
这个正则表达式匹配任何带有字母“g”的单词。所以现在我需要限制长度,但是当我尝试时
\b([A-Za-z].[Gg][A-Za-z].){4}\b
它失败了

【问题讨论】:

  • 你考虑子串只包含ASCII字母的情况吗?如果是,则 naurel 建议的 SO 帖子中的解决方案不符合您的要求。
  • 我的回答可能很着急。在句子“azeGaze”中是否匹配:“azeG”&“zeGa”&“zGaz”&“Gaze”?或者没有,因为您正在寻找一个词(即用空格分隔),只是“azeG”还是“Gaze”?
  • 是的,我只需要 ASCII 字符串。在句子“azeGaze”中,它必须不匹配任何内容,因为“azeGaze”的长度不超过 4 个字母。
  • 字符串_azeG_ 呢?

标签: regex


【解决方案1】:

要仅匹配长度为 4 且包含特定字母的 ASCII 字母序列,您可以使用

\b(?=\w*[Gg])[a-zA-Z]{4}\b

regex demo

正则表达式分解:

  • \b - 单词边界(我们需要下一个字母是单词字符:[a-zA-Z0-9_],但我们会将其限制为 [a-zA-Z] 以及随后的消费模式)
  • (?=\w*[Gg]) - 正向前瞻,确保单词中至少有一个 gG\w* 匹配 0 个或多个字母数字符号)
  • [a-zA-Z]{4} - 4 个 ASCII 字母
  • \b - 词尾边界

【讨论】:

  • 谢谢!我将使用稍微修改的正则表达式\b(?=[a-zA-Z]*[Gg])[a-zA-Z]{4}\b
  • 似乎在前瞻中检查这一点的最佳方法是使用对比原理。我宁愿建议\b(?=[a-fh-zA-FH-Z]*[Gg])[a-zA-Z]{4}\b。如果可以使用修饰符,请使用 (?i)\b(?=[A-FH-Z]*[G])[A-Z]{4}\b/\b(?=[A-FH-Z]*[G])[A-Z]{4}\b/i(不知道,因为您没有指定语言)。
【解决方案2】:

已经回答@Alan Moore 的here

你只需要adapt

(?<!\S)(?=[a-zA-Z]{4}(?!\S))\S*[gG]\S*

(?&lt;!\S) 匹配前面没有非空格的位置 特点。

(?=[a-zA-Z]{4}(?!\S)) 进一步断言该位置是 后跟正好 4 个字母。

一旦环顾四周 满意,\S*[gG]\S* 继续消费字符串, 假设至少有一个字符是 g 或 G。

【讨论】:

  • 请注意,对于 OP 要求,此解决方案可能过于“贪婪”,因为它匹配任何指定长度的非空白序列并在其中包含一些符号。
猜你喜欢
  • 1970-01-01
  • 2012-11-14
  • 2022-01-04
  • 2011-05-14
  • 1970-01-01
  • 2016-09-18
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多