【问题标题】:How to add a wildcard in a regexp repeated character class如何在正则表达式重复字符类中添加通配符
【发布时间】:2020-09-14 22:34:42
【问题描述】:

我正在尝试查看 RE 中是否有一种方法可以表达由一组给定字母加上一个通配符组成的单词的匹配。

例如,查找系统词典中包含 C、O、I 和任何其他字母的任意组合的所有单词,以任意顺序查找,而不重复使用已匹配的字母,并用完所有提供的字母。所以在这种情况下,一个 RE 需要匹配

coif
coil
coin
coir
foci
icon
loci
rico

也许还有我想念的其他人。

我没有足够的数学逻辑学家知道这在正则表达式中是否可能。 它不必完全在一个正则表达式中完成——如果它使用几个阶段就可以了;它可以在脚本中进行后处理。我找不到像'^[oci.]*$'(错误)这样的表示,甚至开始解决这个问题。

【问题讨论】:

  • 我不确定 c、o、i 是否会聚在一起。如果确实如此,那么这可能有效吗? ((c|o|i){1}(c|o|i){1}(c|o|i){1})
  • ([^cio])(?=.*c)(?=.o)(?=.*i).+ 试试这个。如果您将其限制为 4 个字母,它应该可以工作。
  • 链接一些前瞻可以工作。 F.e. ^(?=.*[i])(?=.*[c])(?=.*[o])(?!.*(\w).*\1)[a-z]{4}$
  • @stackFan 在这个例子中,所有字母 (c,o,i) 必须以任意顺序出现一次
  • arundeep LukStorms 那些返回不匹配

标签: regex grep wildcard


【解决方案1】:

既然你说It doesn't have to be done entirely in a regexp,这将适用于任何POSIX awk:

awk '/^.{4}$/ && /c/ && /o/ && /i/ && /[^coi]/' file

【讨论】:

    【解决方案2】:

    谢谢大家。用循环解决,所以它是可扩展的

    【讨论】:

    • why-is-using-a-shell-loop-to-process-text-considered-bad-practice。是什么让您认为 the answer I posted 的可扩展性不如您想出的任何循环?
    • 我需要对其进行参数化以处理任何字符串,而不仅仅是我发布的示例字母。
    • 那将是微不足道的,但这与您提出的问题和我回答的问题不同。如果您自己尝试后无法弄清楚如何做,请发布一个新问题。
    猜你喜欢
    • 2013-02-22
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2013-06-03
    相关资源
    最近更新 更多