是的,它是另一个 .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...
}
}
}
现在这个工作正常,但我的问题是:是否有更简单的方法来检查字符串(整个字符串)是否与正则表达式匹配?我有一个谷歌,但似乎无法找到一个明显的答案。
希望这是有道理的
皮特
更新
感谢所有快速解答,^ $可以解决问题:)
(显示我对正则表达式的经验不足^ __ ^)
答案 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 +19d
,t -99w +14d
,T +75m -64H
,D -1d +4m -44h
不匹配:
d
,d +1
,T +1H -2
,+1D -5M
,-134d
,t-4m
,t +5d5
,D -3m-5d+3g
答案 2 :(得分:1)
在正则表达式中,您可以使用^
和$
字符来表示表达式应与整个测试字符串匹配:
^
,因为第一个字符的意思是“从我的测试字符串的开头匹配”。$
,因为最后一个字符意味着“匹配我的测试字符串的结尾”。组合,(例如^abc$
)整个测试字符串必须与表达式匹配。
答案 3 :(得分:0)
使用此RegEx:
"^\b[DTdt]( *[+-] *[1-9][0-9]* *[dDhHmMwW])*\b$"
^字符匹配字符串的开头,而$表示字符串的结尾。
答案 4 :(得分:0)
使用:\Abla\Z
\A
主题的开头。\Z
主题结束。或使用:^bla$
启用多线模式。
^
开始一行。$
行尾。