我有一个脚本文件,我正在尝试加载,我似乎无法使我的正则表达式工作。我的正则表达式对我有点生气,但我很惊讶我的工作没有用。
基本上,每一行(空白行除外,以及以注释(“//”)开头的行)应采用以下格式:
[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]+
。
答案 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+)(.+)
您可以使用\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