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在第一个斜杠之后没有明确遵循?

4

4 回答 4

3

这应该可以解决您的问题:

^[^/]*/DATA/.*$
于 2012-07-13T09:48:12.797 回答
0

您应该标记行的开头:

^[^/]*/data/.*

此外,确保 Regex 处于多行模式并忽略大小写

于 2012-07-13T09:46:26.810 回答
0
Regex regex = new Regex("^[^/]*/data/.*",
                        RegexOptions.IgnoreCase|RegexOptions.Multiline);
于 2012-07-13T09:53:29.043 回答
0

你有很多选择——比如你可以捕获所有 DATA 并稍后检查文本 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'之前起作用。

于 2012-07-13T10:36:39.243 回答