.NET Regex isMatch vs Matches问题

时间:2009-11-18 12:44:23

标签: c# .net regex

是的,它是另一个 .net正则表达式问题:)(请原谅实际问题的长华夫饼干)

我允许用户使用简单的日期/时间宏快速输入日期(他们不想要日期选择器)

例如,他们可以输入:
d +1d -2h
这将给他们一个今天日期的日期时间字符串,加上一天,减去两个小时。

无论如何我已经创建了一个正则表达式来匹配这些工作正常(可能不是最好的方法,但它的工作原理!):
  \b[DTdt]( *[+-] *[1-9][0-9]* *[dDhHmMwW])*\b

因为您可能已经猜到我正在使用正则表达式来验证这些条目,然后再解析它们以计算生成的日期时间。起初我使用了类似的东西:

Regex rgxDateTimeMacro = new Regex(@"\b[DTdt]( *[+-] *[1-9][0-9]* *[dDhHmMwW])*\b");

if(rgxDateTimeMacro.isMatch(strInput)){
  ...string passes...
}

然后我很快意识到,如果传递的字符串中有任何匹配,则isMatch返回true,
d +1d +1
会返回true ^ __ ^

所以我改变它来做这样的事情:

Regex rgxDateTimeMacro = new Regex(@"\b[DTdt]( *[+-] *[1-9][0-9]* *[dDhHmMwW])*\b");
MatchCollection objMatches = rgxDateTimeMacro.Matches(strInput);

if (objMatches.Count > 0)
{
    // to pass.. we need a match which is the same length as the input string...
    foreach (Match m in objMatches)
    {
        if (m.Length == strInput.Length)
        {
            ...string passes...
        }
    }
}

现在这个工作正常,但我的问题是:是否有更简单的方法来检查字符串(整个字符串)是否与正则表达式匹配?我有一个谷歌,但似乎无法找到一个明显的答案。

希望这是有道理的

皮特


更新

感谢所有快速解答,^ $可以解决问题:)

(显示我对正则表达式的经验不足^ __ ^)

5 个答案:

答案 0 :(得分:10)

如果我理解正确,请使用:^my regex$

^ - 字符串的开头
$ - 字符串结尾

答案 1 :(得分:3)

写一个更好的模式,只匹配你真正想要匹配的东西! ;)

我的建议;

^[DTdt](\s+[+-]\s+[1-9][0-9]*[dDhHmMwW])+$

显示差异的简短说明;

1: ^                  beginning of string
2: [DTdt]             matches 1 character of the given
3:  (                 open group 1
4:   \s+              one or more whitespaces
5:   [+-]             either + or -
6:   \s+              see above
7:   [1-9][0-9]*      matches one number of 9 followed by none or more numbers of 10
8:   [dDhHmMwW]       one of the characters
9:  )                 close group 1
10: +                 let group 1 only repeat 1 or more times
11: $                 end of string

我希望你能看到你的模式存在差异。

<强>匹配 D +19dt -99w +14dT +75m -64HD -1d +4m -44h

不匹配: dd +1T +1H -2+1D -5M-134dt-4mt +5d5D -3m-5d+3g

答案 2 :(得分:1)

在正则表达式中,您可以使用^$字符来表示表达式应与整个测试字符串匹配:

  • ^,因为第一个字符的意思是“从我的测试字符串的开头匹配”。
  • $,因为最后一个字符意味着“匹配我的测试字符串的结尾”。

组合,(例如^abc$)整个测试字符串必须与表达式匹配。

答案 3 :(得分:0)

使用此RegEx:

"^\b[DTdt]( *[+-] *[1-9][0-9]* *[dDhHmMwW])*\b$"

^字符匹配字符串的开头,而$表示字符串的结尾。

答案 4 :(得分:0)

使用:\Abla\Z

  1. \A主题的开头。
  2. \Z主题结束。
  3. 或使用:^bla$启用多线模式。

    1. ^开始一行。
    2. $行尾。