ListDirectoryDe​​tails行上的正则表达式

时间:2015-06-30 12:52:33

标签: c# regex

我有以下示例行:

- [RWCE-FM-] nw0113                        8415232 Dec 31  2014 seil12.dat
- [RWCE-FM-] nw0113                       63229952 Jun 30 08:18 prenosdb.dat
- [RWCE-FM-] admin                           16384 Oct 02  2000 monitsml
- [RWCE-FM-] ap                               2101 Jun 16 20:43 za000616.txt

从每一行开始,我需要保存文件名。但是,我的正则表达式只运行前3行,但不是最后一行。有没有人有任何想法? 这是我的正则表达式:

Regex Name = new Regex(@"\w+\.?\w+\n");

4 个答案:

答案 0 :(得分:2)

正如您已经从评论中猜到的那样,主要问题在于正则表达式中的\n,需要换行符\n才能在您搜索的文本之后。您不仅限于使用正则表达式来获得预期结果。

正则表达方式

您似乎只匹配行尾的那些文字。您可以使用多线模式匹配它们:

(?m)\w+\.?\w+\r?$

或者

(?m)\w+(?:\.\w+)?\r?$

或者偶数(因为你在行尾的预期子字符串不包含空格):

(?m)\S+\r?$

请参阅demo

或许,(?m)\w+\.?\w+$就足够了,但在多线模式的RegexStorm中,此\r?是必需的。

enter image description here

非正则表达方式

var res = str.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).Select(p => p.Split().LastOrDefault()).ToArray();

enter image description here

答案 1 :(得分:1)

Try this:

public static Regex regex = new Regex(
  "(?<FileName>[^ \\r\\n]+)[\\r\\n]?$",
RegexOptions.IgnoreCase
| RegexOptions.Multiline
| RegexOptions.CultureInvariant
| RegexOptions.Compiled
);

FileName should have the name of the file.

答案 2 :(得分:1)

通过简单地匹配非空白([^\s]+)的所有文本,直到行\r\n的末尾或文件标记$的结尾,可以更简化模式。< / p>

实施例

Regex.Matches(text, @"[^\s]+(?:[\r\n]|$)", RegexOptions.Multiline)
     .OfType<Match>()
     .Select (mt => mt.Value);

结果

enter image description here

请注意(?: )是一种锚定工具,它基本上表示匹配文本,但不能捕获它。

答案 3 :(得分:0)

为什么不呢:

static string[] GetFileNames(string[] dirty)
{
   string[] result = new string[dirty.Length]; int index = 0;
   for(int i = 0; i < dirty.Length; i++)
   { 
      index = dirty[i].LastIndexOf(' ');
      result[i] = dirty[i].Substring(index + 1, dirty[i].Length - index - 1);
   }
   return result;
}

P.S。 btw Split()然后First()需要8倍的CPU滴答来处理,效率较低。而Regex甚至更慢。

检查:Performance test