我有以下示例行:
- [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");
答案 0 :(得分:2)
正如您已经从评论中猜到的那样,主要问题在于正则表达式中的\n
,需要换行符\n
才能在您搜索的文本之后。您不仅限于使用正则表达式来获得预期结果。
您似乎只匹配行尾的那些文字。您可以使用多线模式匹配它们:
(?m)\w+\.?\w+\r?$
或者
(?m)\w+(?:\.\w+)?\r?$
或者偶数(因为你在行尾的预期子字符串不包含空格):
(?m)\S+\r?$
请参阅demo
或许,(?m)\w+\.?\w+$
就足够了,但在多线模式的RegexStorm中,此\r?
是必需的。
var res = str.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).Select(p => p.Split().LastOrDefault()).ToArray();
答案 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);
请注意(?: )
是一种锚定工具,它基本上表示匹配文本,但不能捕获它。
答案 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甚至更慢。