我正在尝试编写一个正则表达式来验证并从冒号分隔的字符串中提取值,该字符串可以具有1-4个值。我发现有固定数量的变量的示例,并尝试使用此变量,但是它仅选择第一个和最后一个值,我需要提取所有变量。当前的正则表达式还包括:在匹配中,如果可能的话,我只是想要该值
我目前正在使用它;
^([01ab])+(\:[01ab])*
但是它只提取第一个和最后一个值,如果存在则不提取中间的值。
有效值;
0
0:a
0:a:1
0:1:a:b
无效
0:a:
0:a:1:b:
答案 0 :(得分:2)
我建议采用两步方法:使用正则表达式验证格式,然后在符合条件的情况下用:
分割字符串。
if (Regex.IsMatch(text, @"^[01ab](?::[01ab])*$"))
{
result = text.Split(':');
}
^[01ab](?::[01ab])*$
正则表达式将字符串的开头与^
,0
,1
,a
或b
匹配,然后匹配0重复:
或更多重复,后跟0
,1
,a
或b
,然后结束字符串($
)。>
如果您想稍微玩一下正则表达式,您会看到C#允许您通过CaptureCollection
访问所有捕获组值:
var text = "0:1:a:b";
var results = Regex.Match(text, @"^(?:([01ab])(?::\b|$))+$")?
.Groups[1].Captures.Cast<Capture>().Select(c => c.Value);
Console.WriteLine(string.Join(", ", results)); // => 0, 1, a, b
请参见C# demo和regex demo。
正则表达式详细信息
^
-字符串的开头(?:([01ab])(?::\b|$))+
-1次或多次重复:
([01ab])
-第1组:0
,1
,a
或b
(?::\b|$)
-:
后跟字母,数字(\b
也可以跟随_
,但模式中缺失)或字符串末尾$
-字符串的结尾。答案 1 :(得分:0)
一个不使用正则表达式的方法(以及为什么除非确实需要使用正则表达式)是这样:
bool Validate(string s)
{
string[] valid = {"0", "1", "a", "b"};
var splitArray = s.Split(':');
if (splitArray.Length < 1 || splitArray.Length > 4)
return false;
return splitArray.All(a => valid.Contains(a));
}
答案 2 :(得分:-1)
使用字符串方法比使用正则表达式更有效。因此,请尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication137
{
class Program
{
static void Main(string[] args)
{
string[] inputs = { "0", "0:a", "0:a:1", "0:1:a:b", "Not valid", "0:a:", "0:a:1:b:" };
foreach (string input in inputs)
{
string[] splitArray = input.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
if (splitArray.Length < 2)
{
Console.WriteLine("Input: '{0}' Not Valid", input);
}
else
{
Console.WriteLine("Input: '{0}' First Value : '{1}', Last Value : '{2}'", input, splitArray[0], splitArray[splitArray.Length - 1]);
}
}
Console.ReadLine();
}
}
}