C#中出现意外的Regex.Match结果

时间:2014-08-14 09:10:43

标签: c# regex

Match match = Regex.Match(returnValue, @regex, RegexOptions.IgnoreCase);

上面一行代码中的变量包含以下值:

returnValue : "Tags"

@regex : "[A-Z][a-z][a-z]"

我假设正则表达式函数匹配应该失败,因为单词“Tags”有3个小写字母而不是2正如regex变量所示。但是,对于上面的代码, match.Success总是返回true

这让我很困惑,任何解释都会受到赞赏。谢谢!

更新

以下是我需要的更详细的解释。我正在尝试创建类似正则表达式生成器的东西。

用户输入A表示较高,a表示较低,d表示数字。现在,如果用户传递了Tags之类的单词,我会检查传递的字符串,看它是否适合用户指定的规则。

这是我目前的逻辑:

  if (patternChars[strIndex] == 'A') 
{
     regexBuilder.Append("[A-Z]");
} else if (patternChars[strIndex] == 'a') 
{
     regexBuilder.Append("[a-z]");
} else if (patternChars[strIndex] == 'd') 
{
     regexBuilder.Append("\\d");
} else {
     regexBuilder.Append(patternChars[strIndex]);
}

我猜这需要改变吗?

3 个答案:

答案 0 :(得分:3)

试试这个:

@regex : "^[A-Z][a-z][a-z]$"

说明:

  • $与行结尾匹配,因此您的第三个组将匹配小写g,但是还有其他字符,导致$无法匹配。

  • ^与第一行匹配,阻止字符串中间的匹配,例如,guten TagaaaAaa

这应该仅匹配Tag,而不是Tags。但它也会与ZagAaa等匹配。 - 你真的想要吗?

第三次编辑: 你正在使用这一行:

Match match = Regex.Match(returnValue, @regex, RegexOptions.IgnoreCase);

为什么在进行区分大小写的匹配时忽略这种情况?

进行编辑: 这取决于 - 当您的用户想要在字符串中找到它时,它是可以的。如果你想知道一个给定的字符串是否匹配,你需要预先添加" ^"并附加" $"最后。

答案 1 :(得分:2)

您可以尝试这样:

^[A-Z][a-z][a-z]$

Regex demo

答案 2 :(得分:1)

Match(String,String,RegexOptions)方法返回与输入字符串中的正则表达式模式匹配的第一个子字符串;

 regexBuilder.Append("^");
  if (patternChars[strIndex] == 'A') 
{
 regexBuilder.Append("[A-Z]");
} else if (patternChars[strIndex] == 'a') 
{
 regexBuilder.Append("[a-z]");
} else if (patternChars[strIndex] == 'd') 
{
  regexBuilder.Append("\\d");
} else {
 regexBuilder.Append(patternChars[strIndex]);
}
regexBuilder.Append("$");