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

时间:2011-10-22 22:20:49

标签: c# regex

我需要一些帮助才能为字符匹配编写正则表达式。场景是我有一个大约300 000行的文本文件,每行有一个单词。我需要找到与某组字符匹配的单词。

将Scrabble视为一个非常相似的示例,其中用户有一组字符,例如 PES 加上通配符字符,可以匹配任何字符(但是只有一次。

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

  • PIE
  • PIES
  • PEES
  • PASS

...只有粗体字才能匹配,因为每个用户的字符(包括通配符)在匹配时最多只能使用一次。

有没有办法为此编写正则表达式?

我已经开始......:

  

\ B [P,E,S] \ B'/ P>

...但不知道我应该如何表达:

  1. 每个字符(P,E,S)只能使用一次
  2. 任何字符(通配符)也可以使用一次
  3. 提前谢谢!如果我需要澄清问题,请告诉我。

    //彼得

2 个答案:

答案 0 :(得分:1)

使用正则表达式(如果可能的话)这不是很容易。 更简单的是这样的事情:

List<char> set = new List<char>("PES");

string s = "PIES";

bool matches = s.Count(ch => !set.Remove(ch)) < 2;

答案 1 :(得分:1)

不可能是什么:

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

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

基本上,如果你将其分解,有五个组成部分:

首先前瞻:

(?=^.+$)

检查长度是否> = 1

然后是三个部分:

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

表示E和S分别检查是否存在最多1个这样的字符。

上面只是告诉检查整个字符串是否出现一次P.​​如果发现多于一个P,则正则表达式失败。同样适用于以下两个前瞻。

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