我有一些文本,其中以下是一个示例:
2_Chief Ships.Niobe 2 0 2 1.0
3_Chief Vehicles.WillisMB_US 1
[0_Chief_Road]
77704.27 140254.33 120.00 0 2 9.166666984558105
100653.84 140379.05 120.00
[2_Chief_Road]
76911.77 139996.94 120.00 0 2 3.8583335876464844
100446.47 140028.61 120.00
我想在[0_Chief_Road]下检索这个部分:
77704.27 140254.33 120.00 0 2 9.166666984558105
100653.84 140379.05 120.00
我正在使用此代码:
System.Text.RegularExpressions.Regex reg = null;
string routeTitle = "[0_Chief_Road]"; // this is hard coded for StackOverflow
reg = new System.Text.RegularExpressions.Regex(@"(?<=" + routeTitle + @")[\d\.\s]+(?=\[)");
string routeText = reg.Match(chiefsSection).Captures[0].ToString();
我得到的结果是:
4.27 140254.33 120.00 0 2 9.166666984558105
100653.84 140379.05 120.00
... 在第一个零之后的所有!我已经尝试更改值,它总是返回第一个零后的所有内容。我不明白为什么!!
有人可以帮帮忙吗?谢谢!
格雷格
答案 0 :(得分:2)
问题是routeTitle
包含括号,当在正则表达式中使用时,它将被解释为字符类。在将其插入正则表达式之前,您需要转义任何文字字符串。
所以你应该使用string routeTitle = @"\[0_Chief_Road\]";
或使用Regex.Escape()
功能:
string routeTitle = "[0_Chief_Road]"; // this is hard coded for StackOverflow
reg = new System.Text.RegularExpressions.Regex(@"(?<=" + Regex.Escape(routeTitle) + @")[\d\.\s]+(?=\[)");
请注意[0_Chief_Road]
之后的CRLF也将成为匹配的一部分 - 如果您不想这样做,请在lookbehind断言结束时添加\s+
。