与通配符匹配的正则表达式,其中表达式中的每个字符只能使用一次
本文关键字:一次 字符 通配符 正则表达式 表达式 | 更新日期: 2023-09-27 18:12:10
我需要一些帮助来编写字符匹配的正则表达式。这个场景是,我有一个大约有30万行的文本文件,每行有一个单词。我需要找到与一组特定字符匹配的单词。
将Scrabble视为一个非常类似的示例,其中用户有一组字符,例如 p E S加上通配符字符,该字符可以匹配任何字符(但只能匹配一次)。
如果文本文件包含以下单词:
- 派 <
- 馅饼/strong>
- 皮 通过
- 请
…只有粗体部分应该匹配,因为用户的每个字符,包括通配符,在匹配中最多只能使用一次。
是否有一种方法来写一个正则表达式?
我从……开始:
' b [p, E S] ' b
…但我不知道该怎么表达:
- 每个字符(P, E, S)只能使用一次
- 任何字符(通配符)也可以使用一次
提前感谢!如果我需要澄清问题,请告诉我。
彼得//
这对于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,则正则表达式失败。对于下面的两个查找也是如此。
对于通配符,我必须考虑一个聪明的方法:)..