与通配符匹配的正则表达式,其中表达式中的每个字符只能使用一次

本文关键字:一次 字符 通配符 正则表达式 表达式 | 更新日期: 2023-09-27 18:12:10

我需要一些帮助来编写字符匹配的正则表达式。这个场景是,我有一个大约有30万行的文本文件,每行有一个单词。我需要找到与一组特定字符匹配的单词。

将Scrabble视为一个非常类似的示例,其中用户有一组字符,例如 p E S加上通配符字符,该字符可以匹配任何字符(但只能匹配一次)。

如果文本文件包含以下单词:

  • <
  • 馅饼/strong>
  • 通过

…只有粗体部分应该匹配,因为用户的每个字符,包括通配符,在匹配中最多只能使用一次。

是否有一种方法来写一个正则表达式?

我从……开始:

' b [p, E S] ' b

…但我不知道该怎么表达:

  1. 每个字符(P, E, S)只能使用一次
  2. 任何字符(通配符)也可以使用一次

提前感谢!如果我需要澄清问题,请告诉我。

彼得

//

与通配符匹配的正则表达式,其中表达式中的每个字符只能使用一次

这对于regex来说不是很容易(如果可能的话)。更简单的是这样:

List<char> set = new List<char>("PES");
string s = "PIES";
bool matches = s.Count(ch => !set.Remove(ch)) < 2;

没有什么是不可能的:

您可以使用lookhaeds对正则表达式执行此操作:

(?=^.+$)(?=^[^P]*?P?[^P]*?$)(?=^[^E]*?E?[^E]*?$)(?=^[^S]*?S?[^S]*?$)

基本上,如果你把它分解成五个部分:

第一步:

(?=^.+$)

检查长度是否>= 1

然后是三部分:

(?=^[^P]*?P?[^P]*?$)

对于E和S分别检查这些字符是否最多存在1个。

上面的命令只是告诉检查整个字符串是否出现一个p,如果找到多个p,则正则表达式失败。对于下面的两个查找也是如此。

对于通配符,我必须考虑一个聪明的方法:)..