正则表达式格式返回空结果 - C#

5

我有以下文本行,我打算提取“,”后面的“日期”,即 1 Sep 2015

分配/捆绑报告10835.0000天报告步骤228,2015年9月1日

我编写了以下正则表达式代码,但它返回匹配项为空。

`Regex regexdate = new Regex(@"\Allocation/bundle\s+\report\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\,\+(\S)+\s+(\S)+\s+(\S)");  // to get dates

MatchCollection matchesdate = regexdate.Matches(text);

你能否就我提到的正则表达式格式问题提供建议?


1
\A是锚定符号,用于在字符串开头进行断言。你可能想要使用的是A。将(\S)+修改为(\S+)。同时,\r是回车匹配模式,需要删除反斜杠。 - Wiktor Stribiżew
2个回答

5

\A是一个锚点,用于断言字符串的开始。你可能想要使用A。将(\S)+改为(\S+)。同样,\r是匹配模式的回车符,请删除反斜杠以将\r变成r

使用

@"Allocation/bundle\s+report\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\,\s+(\S+)\s+(\S+)\s+(\S+)"

请参考正则表达式演示
请注意,正则表达式的最后一部分可以更具体地匹配1个或多个数字,然后是一些字母,最后是4个数字:(\S+)\s+(\S+)\s+(\S+) -> (\d+)\s+(\p{L}+)\s+(\d{4}) 同时,以下是图片:enter image description here

1
谢谢!这太棒了。有效!! - user7157732

5

你能不使用正则表达式完成吗?以下是一个使用LINQ的示例。

var text = "Allocation/bundle report 10835.0000 Days report step 228, 1 Sep 2015";

var sDate = text.Split(',').Last().Trim();

if (string.IsNullOrEmpty(sDate))
{
    Console.WriteLine("No date found.");
}
else
{
    Console.WriteLine(sDate); // Returns "1 Sep 2015"
}

我也喜欢这种方法。我应该提到我的文本有多行。因此,这可能不起作用!但在其他情况下,我一定会使用它! - user7157732
2
@user7157732 只需逐行应用此逻辑。 - juharr
哦,太酷了!谢谢@Noppadet - user7157732
我想知道在大文本文件的情况下哪种方法更快。@noppadet - user7157732
@user7157732 我不确定。我猜字符串操作在这种情况下会比正则表达式更快,但测试是继续进行的最佳方式。这里的优势不一定是性能,而是清晰度和易于维护。 - Noppadet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接