匹配在特殊单词之前具有单个斜杠的行

时间:2012-07-13 09:41:52

标签: c# regex

我有许多类似格式的行(实际上是文件路径)。例如:

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未明确跟踪,如何指示它过滤掉该行?

4 个答案:

答案 0 :(得分:3)

这可以解决您的问题:

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

答案 1 :(得分:1)

您应该标记该行的开头:

^[^/]*/data/.*

此外,确保Regex处于多线模式&案例被忽略

答案 2 :(得分:0)

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

答案 3 :(得分: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'之前没有'/'。