2010-01-26 51 views
0

此刻我想如C#模式匹配的可靠途径?

text text date1 date2

所以我有正则表达式完成这些任务的匹配模式。然而,这个问题是,例如,如果用户输入的数据说多于1个空格或者他们把一些文字放在一个新行中等模式不会被拿起,因为它不确切符合模式设置。

是否有更可靠的模式匹配方式?我们的目标是让用户编写起来非常简单,但在我的结尾可以轻松匹配。我正在考虑删除所有的空白/换行符等,然后尝试匹配没有空格的模式,即texttextdate1date2

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

更新

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

FIND [email protected] 01/01/2010 to 10/01/2010

这里是我当前的正则表达式:

FIND [A-Z0-9._%+-][email protected][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,但即使在那我可以'在某些场合似乎会得到一场比赛。

我相信这可能是比模式匹配更为解析相关的问题,但我想,也许有这样做的更好的办法...

+1

绝对没有问题,用一个正则表达式匹配多个空格。告诉我们这种模式,你会得到新的回报。 :) – 2010-01-26 14:10:11

+0

@Jonas,正则表达式确实匹配空白,我已经有一个解决问题。我的问题是我遇到的情况有时信息是分开的行等,或者可能是错误的用户输入了一些额外的不需要的文字之间的空格。我希望能够处理这些情况。 – James 2010-01-26 14:13:07

+0

@詹姆斯,请发表您正在使用的正则表达式。 – 2010-01-26 14:14:55

回答

2

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

+0

我想这可能是我实际上缺少的一切,我将调整我的正则表达式,看它是否有效! – James 2010-01-26 14:30:26

+0

是否有方法可以确定和检测您找到的哪种类型的空白? – James 2010-01-26 14:35:40

+0

感谢这似乎是伎俩。 – James 2010-02-10 13:02:37

0

我将字符串分割成一个字符串数组并匹配每个结果字符串到必要的正则表达式。无论你在你的模式具有的物理空间

\s+ 

替代上面,你应该罚款:

+0

为什么要在那里停止? '' – 2010-01-26 14:19:02

0

它是一个讨厌的表情,但这里的东西,会为你提供的输入工作:

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

这将捕获组之间可变数量的空格作为工作好。

+0

不好,我很害怕'\ w'和'@'以及任何空格字符(除了'\ n'),后面的数字将会被匹配''',基本上是贪婪的匹配。使用'?'后缀进行非贪婪匹配。 – 2010-01-26 14:29:22

+0

'.'是字符类的成员,因此它不代表元字符,而是字面值'“。”' – 2010-01-26 14:52:47

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] .n值从1到4将包含您的匹配项。

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) 
{ 
    ... 
}