这个正则表达式有什么不对?

时间:2010-12-15 07:52:43

标签: c# regex

我有一些文本,其中以下是一个示例:

  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

... 在第一个零之后的所有!我已经尝试更改值,它总是返回第一个零后的所有内容。我不明白为什么!!

有人可以帮帮忙吗?谢谢!

格雷格

1 个答案:

答案 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+