目前我正在尝试匹配
等模式 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,但即便如此,我似乎无法在某些场合得到匹配。
我相信这可能是一个比模式匹配更具解析性的问题,但我想也许有更好的方法可以做到这一点......
答案 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)
{
...
}