2010-01-26 56 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) 
{ 
    ... 
}