正则表达式首先出现数字

时间:2018-06-11 15:02:51

标签: c# regex regex-group

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

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

5 个答案:

答案 0 :(得分:1)

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

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

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

(?<=VSCA\|)\d+

Demo

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你不需要Regex,你可以简单地拆分'|'字符:

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

答案 3 :(得分:0)

虽然其他答案工作得非常好,但如果您真的必须使用正则表达式,或者有兴趣知道如何直接进入,那么您可以使用命名组来表示该数字。请考虑以下代码:

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

答案 4 :(得分:0)

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

Try it out here