2009-11-18 24 views
2

是它的另一个.NET正则表达式的问题:)(请原谅长华夫领导到实际问题).NET正则表达式isMatch VS匹配问题

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

例如,他们可以输入:
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... 
     } 
    } 
} 

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

希望这是有道理的

皮特


UPDATE

感谢所有的快速解答,^ $的伎俩:)

(显示与正则表达式我缺乏经验^ __ ^)

回答

10

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

^ - 字符串
$的开始 - 串

+0

+1:我想你需要通过“多线模式”选项。 – 2009-11-18 12:49:29

+0

+1就我个人而言,我在大多数正则表达式中使用'^ $'! – stevehipwell 2009-11-18 13:11:48

0

使用此正则表达式的结束:

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

^字符的字符串开始处匹配,而$意味着结束串。

0

使用:主题\Abla\Z

  1. \A开端。
  2. \Z题目结束。

或使用:^bla$多行模式。

  1. ^行的开头。
  2. $行结束。
2

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

我的建议;

^[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

+0

'[+ | - ]'可能是一个错误(应该是'+ | - '或'[+ - ]')。我也认为OP希望匹配小数字(即使在例子中:'d + 1d -2h') – Kobi 2009-11-18 12:59:05

+0

我在哪里编写'[+ | - ]'?对不起,我只是编辑它;-) - 为了只匹配小数字,OP已经有错误的号码匹配。根据数字应该是'[1-2] [0-9] *'或'[1-9] +'... – 2009-11-18 13:01:06

1

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

  • ^作为第一个字符意味着“匹配从我的测试字符串的开始”。
  • $作为最后一个字符的意思是“匹配到我的测试字符串的末尾”。

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