正则表达式与末尾的任何字符串匹配

时间:2014-07-22 20:59:58

标签: c# .net regex string

我有一个脚本文件,我正在尝试加载,我似乎无法使我的正则表达式工作。我的正则表达式对我有点生气,但我很惊讶我的工作没有用。

基本上,每一行(空白行除外,以及以注释(“//”)开头的行)应采用以下格式:

[decimal number],[hex number],[hex number],[any string of characters]

例如,每个非空白或完全注释的行应如下所示:

01, 0x00100204, 0x00000000, some string goes here

我的比赛模式如下

"[0-9]+[\\s]+,0[xX][0-9a-fA-F]+[\\s]+,0[xX][0-9a-fA-F]+[\\s]+,"

我离开了尾巴,(字符串的位置)因为,根据我对正则表达式的理解,只要能找到匹配匹配模式的子字符串,它就会匹配。我在这里做出正确的假设吗?

----编辑-----
我还想注意,我不在乎数字末尾和下一个逗号之间有多少个空格,因此[\\s]+

6 个答案:

答案 0 :(得分:2)

你的正则表达式应该是这样的:

"[0-9]+,\\s*0[xX][0-9a-fA-F]+,\\s*0[xX][0-9a-fA-F]+,\\s*"

匹配整个字符串的更好方法是:

@"(?mi)^[0-9]+,\s*0x[0-9a-f]+,\s*0x[0-9a-f]+,.*$"

如果您知道之间总是有1个或更多空白字符,请改用\s+

答案 1 :(得分:1)

在空格和逗号之间切换位置应该会有所帮助:

@"\d+,\s*0[xX][0-9a-fA-F]+,\s*0[xX][0-9a-fA-F]+,\s*"

最初的@有助于逃避,你不应该写[\s]+,因为\s已经是一个字符类,就像\d一样。

答案 2 :(得分:1)

使用逐字字符串(随@一起引入)。反斜杠不需要以逐字字符串进行转义。

使用RegexOptions.IgnoreCase选项,而不是提供小写和大写变体。

string pattern = @"^\d+,\s*0x[0-9a-f]+,\s*0x[0-9a-f]+,.*$";
MatchCollection matches = Regex.Matches(input, pattern,
                                    RegexOptions.IgnoreCase | RegexOptions.Multiline);

^$匹配行的开头和结尾。如果您的输入字符串包含所有行,请使用RegexOptions.Multiline选项,以使^$匹配任何行的开头和结尾,而不仅仅是开头和结尾整个字符串。

答案 3 :(得分:1)

这个可以帮助你,每个细分也可以在小组中使用:

([0-9]+),[\s]+(0[xX][0-9a-fA-F]+,\s+)(0[xX][0-9a-fA-F]+,\s+)(.+)

Live Demo

您可以使用\d代替[0-9]并更改此模式,以排除您不想要的任何内容。

答案 4 :(得分:1)

这里不需要正则表达式。一个简单的 Split 就足够了

string input = "01, 0x00100204, 0x00000000, some string goes here";

var parts = input.Split(new char[] { ',' }, 4, StringSplitOptions.RemoveEmptyEntries);

答案 5 :(得分:0)

在您的正则表达式模式中将逗号放在\s+之前。

根据您的需要选择。 \s匹配任何空格字符[\r\n\t\f ]。如果您只查找空间,请使用空格而不是\s

\s*   zero or more times
\s+   one or more times
\s?   zero or one times