C#模式匹配的可靠方式?

时间:2010-01-26 14:08:29

标签: c# regex parsing

目前我正在尝试匹配

等模式

text text date1 date2

所以我有正则表达式就是这样。但是,问题是例如,如果用户输入的数据超过1个空格,或者如果他们将某些文本放在新行中等,则该模式不会被拾取,因为它不会完全匹配模式集。

模式匹配是否有更可靠的方法?目标是使用户可以非常简单地编写,但在我的目的上可以轻松匹配。我正在考虑剥离所有的空白/换行等,然后尝试匹配模式,没有空格,即texttextdate1date2

任何人都有更好的解决方案吗?

更新

以下是我需要匹配的模式的一个小例子:

FIND me@test.com 01/01/2010 to 10/01/2010

这是我现在的正则表达式:

FIND [A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4} [0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4} to [0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4}

这种方法在90%的情况下都能很好地工作,但是,如果用户通过电子邮件提交此信息,它可以包含我不感兴趣的所有不同格式和HTML。我使用的是HtmlAgilityPack和一个HTML标记删除正则表达式以从电子邮件中删除所有HTML,但即便如此,我似乎无法在某些场合得到匹配。

我相信这可能是一个比模式匹配更具解析性的问题,但我想也许有更好的方法可以做到这一点......

6 个答案:

答案 0 :(得分:2)

要匹配至少一个或多个空白字符(空格,制表符,换行符),请使用:

\s+

在您的模式中拥有物理空间的任何地方替换上述内容,您应该没事。

答案 1 :(得分:2)

将文本中的多个组与多个空格和/或换行符进行匹配的示例。

var txt = "text text   date1\ndate2";
var matches = Regex.Match(txt, @"([a-z]+)\s+([a-z]+)\s+([a-z0-9]+)\s+([a-z0-9]+)", RegexOptions.Singleline);

matches.Groups [n] .Value与n从1到4将包含您的匹配。

答案 2 :(得分:0)

我会将字符串拆分为字符串数组,并将每个结果字符串与必要的正则表达式匹配。

答案 3 :(得分:0)

\b(text)[\s]+(text)[\s]+(date1)[\s]+(date2)\b

答案 4 :(得分:0)

这是一个令人讨厌的表达,但这里的内容适合你提供的输入:

  

^(\w+)\s+([\w@.]+)\s+(\d{2}\/\d{2}\/\d{4})[^\d]+(\d{2}\/\d{2}\/\d{4})$

这也适用于捕获组之间的可变数量的空白。

答案 5 :(得分:0)

通过ORegex,您可以对字符串进行标记,并在标记序列上进行模式匹配:

var tokens = input.Split(new[]{' ','\t','\n','\r'}, StringSplitOptions.RemoveEmptyEntries);
var oregex = new ORegex<string>("{0}{0}{1}{1}", IsText, IsDate);

var matches = oregex.Matches(tokens); //here is your subsequence tokens.

...

public bool IsText(string str)
{
    ...
}

public bool IsDate(string str)
{
    ...
}