2011-06-09 35 views
2

我有这样的程序:正则表达式质询

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

+2

您正在构建的正则表达式出来的话,而不是倒过来,因为我认为它应该是:' Regex.IsMatch(w,“^ [rca] + $”)'。在你的情况下,单词“oscar”也会匹配。 – Howard 2011-06-09 16:25:01

回答

3

可以例如做用下面的正则表达式:

"(?=^[^r]*r[^r]*$)(?=^[^c]*c[^c]*$)(?=^[^a]*a[^a]*$)^[rca]+$" 

它匹配由字母“RCA”任何字,但每一个在一次。

附加组件:如果条件是“最多一次”,您可以改用

"(?=^[^r]*r?[^r]*$)(?=^[^c]*c?[^c]*$)(?=^[^a]*a?[^a]*$)^[rca]+$" 
+0

This Works!是否可以通过使用'?'来更改此表达式以允许“ca”,“ra”,“ar”,“r”,“c”和“a”某处? – Cobold 2011-06-09 16:39:16

+0

@Cobold查看我的编辑 – Howard 2011-06-09 16:41:48

+1

+1这非常聪明。你想要匹配的字母越多,它就越不可控,但对于三个字母它仍然可以。 – Tomalak 2011-06-09 16:48:30

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; 
3

这个表达式"^[" + w + "]+$"发现它由字母"rca"

不,它不会所有单词。它搜索的字符串"rca"对所有发生在在w

意思字母(因为你的纯英文的解释反映了你想要的)是:

Dim rx = Regex.IsMatch(w, "^[rca]+$") 

*你可以改变+{3},但这仍然会匹配aaa

要匹配任何排列三个字母,您将不得不自己添加排列组合。正则表达式不能为你做到这一点。

Dim rx = Regex.IsMatch(w, "^rca|rac|acr|arc|car|cra$") 
+0

这不会帮助我,因为我可以将字母更改为“rca”和单词列表。 – Cobold 2011-06-09 16:31:33

+1

@Cobold:*什么*不会帮助你?事实上,我告诉过你,你会这样做手动创建排列?我没有说你必须硬编码。但是*“我如何获得VB.NET中每个字符串的排列?”实际上,对于一个单独的问题来说,它是重要的。 – Tomalak 2011-06-09 16:45:46

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; 
}