正则表达式将带有管道分隔的字符串分成多个组

时间:2013-01-14 20:50:31

标签: c# regex

我正在编写一个将字符串分成两个不同组的c#代码。字符串以管道分隔,如下所示:

  • 两个管道之间可能有空的空间。
  • “5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w”的管道数量是固定的;在这种情况下,有4个管道。

        string value = "122312121|test value||test value 2|5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w|123456789|123456789";
        const string sPattern = @"What should it be here?????";
        var regex = new Regex(sPattern);
        var match = regex.Match(value);
        if (match.Success)
        {
            var begin = match.Groups["begin"].Value;
            var middle = match.Groups["middle"].Value;
            var end = match.Groups["end"].Value;
        }
    

    我试图让代码的输出返回如下:

    • begin =“122312121 |测试值||测试值2 |”
    • middle =“5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w”
    • end =“| 123456789 | 123456789”

但是,我对正则表达式这么新,我试图为变量sPattern编写正则表达式,但是无法为它生成正确的正则表达式。可以请帮忙吗?感谢。

5 个答案:

答案 0 :(得分:3)

你应该使用String.Split

 string [] sarray = value.Split('|')

它将为您提供数组

{"122312121", "test value", "" , "test value" , "2", "5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w", "123456789", "123456789"}

5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w将在sarray[5]

答案 1 :(得分:2)

如果你正在寻找一个与之匹配的正则表达式,并且想要使用正则表达式而不是.Split,你可以试试这个:

"^((.*?[|]){4})(.*?)([|].*)*$"

或更明确地说:

"^(?<begin>(.*?[|]){4})(?<middle>.*?)(?<end>[|].*)*$"

这是基于你说长字符串固定之前的管道数量(4)。

您的代码将如下所示:

string value = "122312121|test value||test value 2|5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w|123456789|123456789";
const string sPattern = @"^((.*?[|]){4})(.*?)([|].*)*$";
var regex = new Regex(sPattern);
var match = regex.Match(value);
if (match.Success)
{
    var begin = match.Groups[1].Value;
    var middle = match.Groups[3].Value;
    var end = match.Groups[4].Value;
}

答案 2 :(得分:1)

诀窍可能是逃避管道角色:

const string sPattern = @"(?<begin>[^|]*\|[^|]*\|[^|]*\|[^|]*\|)" +
                        "(?<middle>[^|]*)" + 
                        "(?<end>\|.*)";

答案 3 :(得分:1)

您可以使用String.Split和一些Linq来执行您需要的操作

粗略的例子:

string value = "122312121|test value||test value 2|5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w|123456789|123456789";
string[] split = value.Split('|');

string begin = string.Join("|", split.Take(4));
string middle = split.Skip(4).Take(1).FirstOrDefault();
string end = "|" + string.Join("|", split.Skip(5).Take(2));

返回

  • begin =“122312121 |测试值||测试值2 |”
  • middle =“5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w”
  • end =“| 123456789 | 123456789”

答案 4 :(得分:1)

这是另一个:

^(?<begin>(.*?\|){4})(?<middle>.*?(?=\|))(?<end>.*)