【问题标题】:Regex first digits occurrence正则表达式第一个数字出现
【发布时间】:2018-06-11 15:02:50
【问题描述】:

我的任务是提取以下字符串中的第一个数字:

GLB=VSCA|34|speed|1|

我的模式如下:

(?x:VSCA(\|){1}(\d.))

基本上我需要提取“34”,即“VSCA”之后出现的第一个数字。使用我的模式,我获得了一个组,但可能只获得数字吗?这是我的 c# sn-p:

string regex = @"(?x:VSCA(\|){1}(\d.))";
Regex rx = new Regex(regex);
string s = "GLB=VSCA|34|speed|1|";

if (rx.Match(s).Success)
{
    var test = rx.Match(s).Groups[1].ToString();
}

【问题讨论】:

  • 如果字符串始终采用这种格式,为什么不直接拆分| 并采用1 索引?

标签: c# regex regex-group


【解决方案1】:

您可以匹配34VSCA 之后的第一个数字)使用正向后向 (?<=VSCA\D*) 断言左侧是 VSCA 后跟零或次不是数字 \D* 和然后匹配一个或多个数字\d+:

(?<=VSCA\D*)\d+

如果您需要管道位于 VSCA 之后,您可以将其包含在后视中:

(?<=VSCA\|)\d+

Demo

【讨论】:

  • 我发布我的答案时没有看到您的答案。感谢输入答案并忘记提交。我已经投票给你了
【解决方案2】:

这个正则表达式模式:(?<=VSCA\|)\d+?(?=\|) 将只匹配数字。 (如果您的数字可能为负数/有小数位,您可能需要改用(?<=VSCA\|).+?(?=\|)

【讨论】:

    【解决方案3】:

    您不需要正则表达式,您可以简单地拆分'|' 字符:

    string s = "GLB=VSCA|34|speed|1|";
    
    string[] parts = s.Split('|');
    
    if(parts.Length >= 2)
    {
        Console.WriteLine(parts[1]); //prints 34
    }
    

    这里的好处是可以根据索引访问原始字符串的所有部分:

    [0] - "GLB=VSCA"
    [1] - "34"
    [2] - "speed"
    [3] - "1"
    

    小提琴here

    【讨论】:

      【解决方案4】:

      虽然其他答案的效果非常好,但如果您确实必须使用正则表达式,或者有兴趣知道如何立即获得该值,则可以使用命名组作为数字。考虑以下代码:

      string regex = @"(?x:VSCA(\|){1}(?<number>\d.?))";
      Regex rx = new Regex(regex);
      string s = "GLB:VSCA|34|speed|1|";
      
      var match = rx.Match(s); 
      if(match.Success) Console.WriteLine(match.Groups["number"]);
      

      【讨论】:

        【解决方案5】:

        (?&lt;=VSCA\|)[0-9]+怎么样?

        Try it out here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-18
          • 2011-01-02
          • 1970-01-01
          • 1970-01-01
          • 2018-06-28
          • 1970-01-01
          相关资源
          最近更新 更多