【问题标题】:Regex Expression match value gives false, whats wrong with expression正则表达式匹配值给出错误,表达式有什么问题
【发布时间】:2017-12-03 00:29:23
【问题描述】:

我有以下类型的字符串,

33739: 033910: *Dec 12 01:09:12.669 UTC: %test1-3-test2: 你好,你好吗

这里,

  1. 我有 6 个冒号 (:)
  2. 有一组特殊的字符串, %(1 个或多个 char 或 num)-(一个 num)-(1 个或多个 char 或 num)

下面的正则表达式匹配结果为false,正则表达式中需要改变什么。谢谢!

private static bool IsValid(string value)
    {
        const string expression = @"(\w+):(\w+):(\w+):%(\w+)-(\d)(\w+):(\w+)";

        return Regex.IsMatch(value, expression, RegexOptions.IgnoreCase);
    }

var X = IsValid("<155>33739: 033910: *Dec 12 01:09:12.669 UTC: %XYz-3-UPDxyt: Hello, How era you");

【问题讨论】:

  • 你有 6 个冒号 (:)
  • 是的,对不起。我忽略了日期/时间
  • 您还可以(仅在 .NET 中)量化匹配组,就像 (?:(.+?)(?::\s|$))+ - 这将匹配任何内容,直到空格冒号或 EOL,多次因为它会匹配 - 你不会在 Regexr 上看到它,但它会记住 .NET 中的每个组,而不仅仅是最后一个。运行匹配后访问Captures 而不是Groups,请参阅stackoverflow.com/questions/13689259/…

标签: c# regex


【解决方案1】:

您的正则表达式缺少冒号后的空格、初始的&lt;&gt; 以及像“*”这样的特殊字符(如果我没记错的话)\w 没有涵盖。试试这个:

输入:
&lt;155&gt;33739: 033910: *Dec 12 01:09:12.669 UTC: %XYz-3-UPDxyt: Hello, How era you

正则表达式:
&lt;(\d+)&gt;(\d+):\s+(\d+):\s+([^%]+)%([A-Za-z]+)-(\d+)-([A-Za-z]+):\s+([\w,\s]+)

匹配:

#0 '<155>33739: 033910: *Dec 12 01:09:12.669 UTC: %XYz-3-UPDxyt: Hello, How era you'
#1 '155'
#2 '33739'
#3 '033910'
#4 '*Dec 12 01:09:12.669 UTC: '
#5 'XYz'
#6 '3'
#7 'UPDxyt'
#8 'Hello, How era you'

C# 代码 v1,索引组:

var input = @"<155>33739: 033910: *Dec 12 01:09:12.669 UTC: %XYz-3-UPDxyt: Hello, How era you";
var regex = new Regex(@"<(\d+)>(\d+):\s+(\d+):\s+([^%]+)%([A-Za-z]+)-(\d+)-([A-Za-z]+):\s+([\w,\s]+)");
var match = regex.Match(input);
if (match.Success)
{
    var date = match.Groups[4];
}

C#代码v2,命名组,将?&lt;yourname&gt;放入组中:

var input = @"<155>33739: 033910: *Dec 12 01:09:12.669 UTC: %XYz-3-UPDxyt: Hello, How era you";
var regex = new Regex(@"<(\d+)>(\d+):\s+(\d+):\s+(?<date>[^%]+)%([A-Za-z]+)-(\d+)-([A-Za-z]+):\s+([\w,\s]+)");
var match = regex.Match(input);
if (match.Success)
{
    var date = match.Groups["date"];
}

似乎命名组已移至匹配组的末尾。所以要么全部命名,要么不命名......

【讨论】:

  • 谢谢迈克尔。有什么方法可以像您在答案#1、#2、....等中显示的那样拆分字符串。
  • 它已经根据您(和迈克尔的)括号匹配组进行了拆分,您只需要在运行 MatchMatches(不是 isMatch)后访问它们
  • 非常感谢@sweaver。
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
相关资源
最近更新 更多