我正在尝试在C#中创建一个简单的正则表达式,将字符串拆分为标记。我遇到的问题是我正在使用的模式捕获一个空字符串,这会抛出我预期的结果。我该怎么做才能改变我的正则表达式,因此它不会捕获空字符串?
var input = "ID=123&User=JohnDoe";
var pattern = "(?:id=)|(?:&user=)";
var tokens = Regex.Split(input, pattern, RegexOptions.IgnoreCase);
// Expected Results
// tokens[0] == "123"
// tokens[1] == "JohnDoe"
// Actual Results
// tokens[0] == ""
// tokens[1] == "123"
// tokens[2] == "JohnDoe"
答案 0 :(得分:2)
虽然您的OP对使用不同方法的评论可能有价值,但他们并未解决您有关RegEx行为的具体问题。
我认为,虽然你获得正则表达式行为的原因与隐式捕获组有关(编辑:或者它可能只是限制第一组的捕获行为就足够了),但我没有&# 39; t使它成为RegEx等级理解的顶层。
编辑:
针对给定测试用例运行RegEx:
(?>id=)|(?:&user=)
如果这些都不符合您的喜好,您可以随时将谓词添加到令牌列表中:
tokens.Where(x => !string.IsNullOrWhiteSpace(x))
答案 1 :(得分:0)
我认为你不能用Regex.Split
来解决这个问题。一种强力方法是删除每个""
:
var input = "ID=123&User=JohnDoe";
var pattern = "(?:id=)|(?:&user=)";
var tokens = Regex.Split(input, pattern, RegexOptions.IgnoreCase).Where(x => x != "");
我认为您应该使用实际捕获组中令牌的正则表达式。
var input = "ID=123&User=JohnDoe";
var pattern = "id=(.+)&user=(.+)";
var match = Regex.Match(input, pattern, RegexOptions
.IgnoreCase);
match.Groups[1] // 123