我有这个程序:
Dim words() As String = {"car", "arc", "caar"}
For Each w In words
Dim rx = Regex.IsMatch("rca", "^[" + w + "]+$")
Console.WriteLine(rx)
Next
Console.ReadLine()
此正则表达式"^[" + w + "]+$"
查找由字母“rca”组成的所有单词。这匹配所有单词,因为所有单词都由“rca”组成。有什么我可以添加,为“caar”返回False,因为“rca”只有一个“a”,但“caar”有两个“a”?
答案 0 :(得分:3)
此正则表达式
的所有单词"^[" + w + "]+$"
查找包含字母"rca"
不,它没有。它会在字符串"rca"
中搜索恰好位于w
你的意思(鉴于你的简明英语解释反映了你想要的):
Dim rx = Regex.IsMatch(w, "^[rca]+$")
*您可以将+
更改为{3}
,但这仍然会匹配aaa
。
要匹配三个字母的任何排列,您必须自己添加排列。正则表达式不能为你做到这一点。
Dim rx = Regex.IsMatch(w, "^rca|rac|acr|arc|car|cra$")
答案 1 :(得分:3)
你可以这样做,例如使用以下正则表达式:
"(?=^[^r]*r[^r]*$)(?=^[^c]*c[^c]*$)(?=^[^a]*a[^a]*$)^[rca]+$"
它匹配任何由字母“rca”组成的单词,但每个单词只匹配一次。
插件:如果条件是“最多一次”,您可以改为使用
"(?=^[^r]*r?[^r]*$)(?=^[^c]*c?[^c]*$)(?=^[^a]*a?[^a]*$)^[rca]+$"
答案 2 :(得分:1)
您必须在正则表达式之外单独执行此操作。 [...]
构造始终将重复的字符视为输入一次。你可以在Console.WriteLine(rx)
之前做这样的事情(注意:用C#写,因为我在VB中不是最新的):
foreach (var ch in w.ToCharArray())
{
if (w.Count(c => c == ch) != "rca".Count(c => c == ch))
return false;
}
答案 3 :(得分:0)
目前,看起来你正在使用这些词作为搜索模式,也许你的意思是:
Dim rx = Regex.IsMatch(w, "^[rca]+$")
为了过滤出只包含模式中某个字母(rca
)的字词,您可以尝试:
^[^rca]*[rca][^rca]*$
这将匹配
"anything not r, c or a" zero or many times;
"r, c or a";
"anything not r, c or a" zero or many times;