好的,我的正则表达式有点生疏,我一直在努力解决这个特殊的问题...
我需要以任何顺序拆分并处理包含以下任意数量的字符串:
字符串非常奇怪(我无法控制它们)。如果字符串中的行中有多个数字,则用逗号分隔。它们需要按照它们在原始字符串中出现的顺序进行处理。
例如,字符串可能如下所示:
abc20a"Hi""OK"100,20b
使用此特定字符串,生成的调用堆栈看起来有点像:
ProcessLetters( new[] { 'a', 'b', 'c' } );
ProcessInts( 20 );
ProcessLetters( 'a' );
ProcessStrings( new[] { "Hi", "OK" } );
ProcessInts( new[] { 100, 20 } );
ProcessLetters( 'b' );
我能做的就是把它当作CSV,你可以通过一次处理一个字符来构建令牌,但我认为用正则表达式可以更轻松地完成它?
答案 0 :(得分:0)
您可以使用或运算符|使正则表达式与三个单独选项中的每一个匹配。这应该捕获有效的令牌,跳过逗号和其他字符。
/[a-z]|[0-9]+|"[^"]"/
你的字符串可以包含转义引号吗?
答案 1 :(得分:0)
您可以使用此字符串中包含的模式:
@"(""[^""]*""|[a-z]|\d+)"
标记您提供的输入字符串。此模式捕获三件事:简单的引用字符串(无嵌入引号),小写字符和一个或多个数字。
如果引用的字符串可以在其中转义引号(例如"Hi\"There\"""OK""Pilgrim"
),那么您可以使用此模式捕获它们并将其与输入字符串的其余部分一起标记:
@"((?:""[^""\\]*(?:\\.[^""\\]*)*"")|[a-z]|\d+)"
以下是一个例子:
MatchCollection matches = Regex.Matches(@"abc20a""Hi\""There\""""""OK""""Pilgrim""100,20b", @"((?:""[^""\\]*(?:\\.[^""\\]*)*"")|[a-z]|\d+)");
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
返回字符串标记:
a
b
c
20
a
"Hi\"There\""
"OK"
"Pilgrim"
100
20
b
这种方法的一个好处是你可以检查第一个字符,看看你需要放置元素的堆栈。如果第一个字符是alpha,那么它进入ProcessLetters堆栈,如果字符是数字,然后它进入ProcessInts。如果第一个字符是引号,则在修剪前导引号和尾随引号并调用Regex.Unescape()
以取消嵌入引号后,它将进入ProcessStrings。
答案 2 :(得分:0)
static void Main(string[] args)
{
string test = @"abc20a""Hi""""OK""100,20b";
string[] results = Regex.Split(test, @"(""[a-zA-Z]+""|\d+|[a-zA-Z]+)");
foreach (string result in results)
{
if (!String.IsNullOrEmpty(result) && result != ",")
{
Console.WriteLine("result: " + result);
}
}
Console.ReadLine();
}