Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET正则表达式isMatch vs Matches问题_C#_.net_Regex - Fatal编程技术网

C# .NET正则表达式isMatch vs Matches问题

C# .NET正则表达式isMatch vs Matches问题,c#,.net,regex,C#,.net,Regex,是的,这是另一个.net正则表达式问题:)(请原谅导致实际问题的冗长华夫饼) 我允许用户使用简单的日期/时间宏快速输入日期(他们不需要日期选择器) 例如,他们可以输入: d+1d-2h 这将为他们提供一个日期时间字符串,即今天的日期加上一天,减去两小时 无论如何,我已经创建了一个正则表达式来匹配这些正则表达式,它工作得很好(可能不是最好的方法,但它工作得很好!): \b[dtdtt](*[+-]*[1-9][0-9]**[dDhHmMwW])*\b 您可能已经猜到了,在解析这些条目以计算结果日期

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

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

例如,他们可以输入:
d+1d-2h

这将为他们提供一个日期时间字符串,即今天的日期加上一天,减去两小时

无论如何,我已经创建了一个正则表达式来匹配这些正则表达式,它工作得很好(可能不是最好的方法,但它工作得很好!):
\b[dtdtt](*[+-]*[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

将返回真值^__^

所以我把它改成这样:

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...
        }
    }
}
现在这很好,但我的问题是:有没有更简单的方法来检查字符串(整个字符串)是否与正则表达式匹配?我用谷歌搜索过,但似乎找不到明显的答案

希望这有意义

皮特


更新

感谢所有的快速回答,^$成功:)


(显示我对正则表达式缺乏经验)

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

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

使用此正则表达式:

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

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

使用:
\Abla\Z

  • \A
    主题的开头
  • \Z
    主题结束
  • 或在启用多行模式的情况下使用:
    ^bla$

  • ^
    行的开头
  • $
    行尾

  • 写一个更好的模式,只匹配你真正想要匹配的

    我的建议

    ^[dtdtdt](\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
    在正则表达式中,可以使用
    ^
    $/code>字符指示表达式应与整个测试字符串匹配:

    • ^
      因为第一个字符表示“从测试字符串开始匹配”
    • $
      因为最后一个字符表示“匹配到测试字符串的末尾”

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

    +1:我认为您需要通过“多行模式”选项。+1我个人在我的大多数正则表达式中使用
    ^$
    <代码>[+|-]
    可能是个错误(应该是“+|-”或
    [+-]
    )。我还认为OP希望匹配较小的数字(甚至在示例中:
    d+1d-2h
    ),我在哪里写的
    [+|-]
    ?对不起,我刚刚编辑过;-)-为了只匹配小的数字,OP已经有一个错误的数字匹配。根据数字的不同,应该类似于
    [1-2][0-9]*
    [1-9]+
    。。。