正则表达式第一个数字出现

Regex first digits occurrence

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

GLB=VSCA|34|speed|1|

我的模式如下:

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

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

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();
}

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

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

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

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

(?<=VSCA\|)\d+

Demo

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

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"

Fiddle here

虽然其他答案非常有效,但如果您真的必须使用正则表达式,或者有兴趣知道如何立即使用正则表达式,您可以为号码使用命名组。考虑以下代码:

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"]);

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

Try it out here