1

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

  • 两个管道之间可能有一个空白空间。
  • “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|"
    • 中间=“5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w”
    • 结束 = "|123456789|123456789"

但是,我对正则表达式很陌生,我尝试为变量 sPattern 编写正则表达式,但无法为其生成正确的正则表达式。有什么可以帮忙的吗?谢谢。

4

5 回答 5

3

你应该使用String.Split

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

那会做的是给你数组

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

并将5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1wsarray[5]

于 2013-01-14T20:58:14.220 回答
2

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

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

或更明确地说:

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

这是基于这样一个事实,即您所说的长弦固定之前的管道数量(四个)。

然后,您的代码将如下所示:

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;
}
于 2013-01-14T21:08:43.153 回答
1

这是另一个:

^(?<begin>(.*?\|){4})(?<middle>.*?(?=\|))(?<end>.*)
于 2013-01-14T21:15:25.320 回答
1

你可以使用String.Splitand someLinq来做你需要的

粗略的例子:

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|"
  • 中间=“5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w”
  • 结束 = "|123456789|123456789"
于 2013-01-14T21:09:19.157 回答
1

诀窍可能是转义管道字符:

const string sPattern = @"(?<begin>[^|]*\|[^|]*\|[^|]*\|[^|]*\|)" +
                        "(?<middle>[^|]*)" + 
                        "(?<end>\|.*)";
于 2013-01-14T21:03:32.617 回答