我的任务是提取以下字符串中的第一个数字:
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();
}
答案 0 :(得分:1)
您可以使用正向后方34
匹配VSCA
((?<=VSCA\D*)
之后的第一个数字),以断言左侧的内容为VSCA
后跟零或次数不是数字\D*
,然后匹配一个或多个数字\d+
:
如果您需要管道位于VSCA
之后,您可以将其包含在外观中:
答案 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]+
怎么样?