正则表达式问题

时间:2011-06-09 16:16:12

标签: .net regex vb.net

我有这个程序:

        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”?

4 个答案:

答案 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;