正则表达式多行奇怪的行为

时间:2013-04-02 13:21:04

标签: c# regex multiline

我有一个这样的字符串:

string text = "ext_bus      0  0/0/3/0.0      side         CLAIMED     INTERFACE    IDE Primary Channel\r\ntarget       0  0/0/3/0.0.0    tgt          CLAIMED     DEVICE       \r\ndisk         0  0/0/3/0.0.0.0  sdisk";

当我进行正则表达式多行搜索以获取ext_bus第三列(0/0/3 / 0.0)和最后一列(IDE主要通道)中的文本时:

Regex regExp = new Regex(@"^ext_bus\s*[0-9]+\s*(?<HWPath>\S+).*\s{2,}(?<BusName>.*?)\r?$", RegexOptions.Multiline);

第一组是OK:“0/0/3 / 0.0”

但第二组是下一行!:“目标0 0/0/3 / 0.0.0 tgt索赔设备”

如何使用Multiline(只有一行),以及如何获取最后一列(在2个或更多空格后的字符串末尾的文本)。

2 个答案:

答案 0 :(得分:0)

简短的回答是,这是因为你的正则表达式中的第一个.*匹配到第一行的结尾,然后\s{2,}匹配换行符,然后是(?<BusName>.*?)将匹配所有第二行。

Multiline模式意味着^$匹配行的开头和结尾,而不仅仅是整个字符串的开头和结尾。

删除.*,然后<BusName>将是0/0/3/0.0后空白行后的其余文字。

答案 1 :(得分:0)

为什么使用正则表达式?

您可以使用拆分

轻松完成
string value = "ext_bus      0  0/0/3/0.0      side         CLAIMED     INTERFACE    IDE Primary Channel\r\ntarget       0  0/0/3/0.0.0    tgt          CLAIMED     DEVICE       \r\ndisk         0  0/0/3/0.0.0.0  sdisk";
char[] delimiters = new char[] {' ' }; // here you can add more seperaors
string[] parts = value.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < parts.Length; i++)
{
    Console.WriteLine(parts[i]);
}