C#正则表达式捕获空字符串

时间:2017-09-22 20:37:47

标签: c# regex

我正在尝试在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"

2 个答案:

答案 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