使用正则表达式在字符串中间查找表达式

时间:2014-07-02 13:33:15

标签: c# regex

我是正则表达式编程的新手,我想搜索一个模式示例:

19:09:41 PM:[0] 0.0-100.2秒796 MBytes 66.6 Mbits/sec 0.273 ms 2454161/3029570(81%) - >我想要66.6 Mbits/sec

18:55:13 PM:[0] 0.0-99.1秒3847 MB​​ytes 326 Mbits/sec 0.068 ms 247494/3029365(8.2%) - >我想要326 Mbits/sec

所以在第一步我想要数字Mbits / sec

这是我的代码段

Regex TP_PatternInt = new Regex(@"(?<TP>\d+) Mbit/sec");
Match TP_MatchInt = TP_PatternInt.Match(StringName);
string ResultInt = TP_MatchInt.ToString().Split(' ')[0];

Regex TP_PatternFloat = new Regex(@"(?<TP>\d+).\d Mbit/sec");
Match TP_MatchFloat = TP_PatternFloat.Match(StringName);
string ResultFloat = TP_MatchFloat.ToString().Split(' ')[0];

if (TP_MatchFloat.Success) Return ResultFloat;
else if(TP_MatchInt.Success) return ResultInt;
but when I run it I never get TP_MatchFloat.Success == true

我在这里缺少什么?有人可以为这两种情况提出单一模式吗?

4 个答案:

答案 0 :(得分:2)

两个问题。其一,正如其他人所示,你的正则表达式并不完全正确。第二,你要声明命名组,但实际上并没有使用它来取出你的值,而是使用字符串解析 - 正则表达式已经为你做了字符串解析,这就是它的目的。让正则表达式做你想做的一切。

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

@"(?<TP>\d+(\.\d+)?)\s+Mbits/sec"

然后你应该使用正则表达式如下:

string searchString = @"19:09:41 PM : [ 0] 0.0-100.2 sec 796 MBytes 66.6 Mbits/sec 0.273 ms 2454161/3029570 (81%)";

Regex regex = new Regex( @"(?<TP>\d+(\.\d+)?)\s+Mbits/sec", RegexOptions.ExplicitCapture );
Match match = regex.Match( searchString );

if ( match.Success )
{
    // If you only need the string representation of the value,
    // do this and you're done:
    string bitrateString = match.Groups["TP"].Value;

    // If you want to parse the string into an actual floating-point type,
    // do this:
    double bitrate;
    bitrate = double.Parse( match.Groups["TP"].Value );

    Console.Out.WriteLine( bitrate );
}
else
{
    Console.Out.WriteLine( "Could not match." );
}

让我们将正则表达式分开一点,以便更容易理解:

  • (?<TP> ... ) - 这是命名捕获的语法,您似乎已经了解
  • \d+ (\. \d+)? - 尝试匹配浮点值。
    • \.表示文字时期; .匹配任何一个字符,所以我们必须逃避它。
    • (\. \d+)?匹配&#39; .66&#39;字符串的一部分。我们设置?来使其成为可选项,因为浮点值有时可以表示为&#34; 66&#34;当值恰好是&#34; 66.00&#34;。如果你知道它将永远存在,你可以简化整个事情,稍后再说。
    • \s+ - 匹配一个或多个空白字符。我倾向于建议\s+以防空格发生变化,也许如果您正在阅读的软件开始列出输出,在这种情况下,他们可能会添加空格,或用标签替换空格。
    • Mbits/sec - 只匹配文字字符串

如上所述,如果您知道您的浮点值将始终具有小数部分,例如,&#34; 12.45&#34;从来没有&#34; 12&#34;,那么你可以将正则表达式简化为:

@"(?<TP>\d+\.\d+)\s+Mbits/sec"

请记住,并非所有软件框架都使用完全相同的正则表达式语法。由于您使用的是C#/ .Net正则表达式,我建议使用RegexLabRegex Hero之类的内容。其他在线测试人员可能期望Perl-compatible regular expressions,这是由Perl编程语言解释的正则表达式; PCRE确实被perl以外的各种软件使用,这就是经常出现混乱的原因。

答案 1 :(得分:1)

  

我在这里缺少什么?

在这个正则表达式@"(?<TP>\d+).\d Mbit/sec"中,您可能忘记转义在正则表达式模式中具有特殊含义的十进制字符。使用转义字符\来匹配它。

  

有人可以为这两种情况提出单一模式吗?

您可以尝试@"(\d+\.\d+|\d+\.?\d?)\sMbits/sec"

模式描述:

\d+  one on more digits
\.?  zero or one decimal character

输入:

19:09:41 PM : [ 0] 0.0-100.2 sec 796 MBytes 66.6 Mbits/sec 0.273 ms 2454161/3029570 (81%)
18:55:13 PM : [ 0] 0.0-99.1 sec 3847 MBytes 326 Mbits/sec 0.068 ms 247494/3029365 (8.2%)
18:55:13 PM : [ 0] 0.0-99.1 sec 3847 MBytes 01.32 Mbits/sec 0.068 ms 247494/3029365 (8.2%)

找到3场比赛:

66.6 Mbits/sec has 1 group:
    66.6
326 Mbits/sec has 1 group:
    326
01.32 Mbits/sec has 1 group:
    01.32

Here

进行测试

答案 2 :(得分:0)

试试这个:

(?<=\s)([1-9]\d*|0)(\.\d*)?\s{1,3}Mbits\/sec

http://regex101.com/r/eC6gR7/2

答案 3 :(得分:0)

使用正则表达式
    ^。 \ S((\ d {1,10})(\ d {1,10})?)\ sMbits /秒。 $
你可以得到三组:第一组 - 整数,第二 - 积分,第三 - 分数。