2012-07-13 24 views
0

我有許多類似格式的行(實際上是文件路徑)。例如:在特殊字詞前匹配具有單斜槓的行

root/DATA/some/file.txt 
root/DATA/another/file.txt 
root/DATA/yet/another/file.exe 
root/site/some/other/folder/before/DATA/file.xml 
root/site/some/other/folder/DATA/file2.xml 

我想只取那些包含單斜線前DATA,這是第3以上的應匹配,但最後2不應該。注意:root應該是一個字符序列,排除/\

我結束了與此正則表達式,但它仍然是所有5個樣品一致:

[^/]*/data/.* 

而且我堅持在這裏...如何指示它過濾掉的情況下,DATA行不繼明確後第一個斜槓?

+0

您是否使正則表達式不區分大小寫? – Oded 2012-07-13 09:43:19

+0

@Oded,是的,但正如你可以看到問題是在正則表達式本身 – 2012-07-13 10:44:50

回答

3

這應該可以解決你的問題:

^[^/]*/DATA/.*$ 
+0

確實!像往常一樣,最後一點點失蹤......謝謝! – 2012-07-13 10:42:10

+0

正則表達式中令人討厭的部分是它有兩個含義。很容易忽視的東西... – dda 2012-07-15 04:10:17

1

你應該標記線的起點:

^[^/]*/data/.* 

此外,確保正則表達式是多模式&情況下被忽略

+0

它的工作原理,謝謝!實際上,我會單獨檢查每一行的匹配情況,因此不需要打開'multiline'。 – 2012-07-13 10:42:55

0
Regex regex = new Regex("^[^/]*/data/.*", 
         RegexOptions.IgnoreCase|RegexOptions.Multiline); 
+0

-1:多行需要設置 – 2012-07-13 09:54:01

+0

只需注意並糾正 – 2012-07-13 09:54:41

0

你有很多選擇 - 就像你可以捕獲所有數據,然後檢查多少元素'/'在文本DATA之前(例如第一組);你可以檢查一個較長的字符串等 - 這正是您要求您可以使用代碼模擬和再利用的東西:它

string type_1 = "" + 
    "root/DATA/some/file.txt" + "\n" + 
    "root/DATA/another/file.txt" + "\n" + 
    "root/DATA/yet/another/file.exe" + "\n" + 
    "root/site/some/other/folder/before/DATA/file.xml" + "\n" + 
    "root/site/some/other/folder/DATA/file2.xml"; 

Console.WriteLine ("Start TEXT:"); 
Console.WriteLine (type_1); 


Console.WriteLine ("Result TEXT:"); 
MatchCollection mat = Regex.Matches (type_1, "^[^/]*/DATA.*?$", RegexOptions.Compiled|RegexOptions.Multiline); 
Console.WriteLine (mat.Count); 
foreach (Match m in mat) { 
    Console.WriteLine (m.ToString()); 
} 

結果的工作是:

Start TEXT: 
root/DATA/some/file.txt 
root/DATA/another/file.txt 
root/DATA/yet/another/file.exe 
root/site/some/other/folder/before/DATA/file.xml 
root/site/some/other/folder/DATA/file2.xml 
Result TEXT: 
3 
root/DATA/some/file.txt 
root/DATA/another/file.txt 
root/DATA/yet/another/file.exe 

它的工作原理通過假設'/'不能在第一個'DATA'之前。

相關問題