我正在编写一个将字符串分成两个不同组的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;
}
我试图让代码的输出返回如下:
但是,我对正则表达式这么新,我试图为变量sPattern编写正则表达式,但是无法为它生成正确的正则表达式。可以请帮忙吗?感谢。
答案 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));
返回
答案 4 :(得分:1)
这是另一个:
^(?<begin>(.*?\|){4})(?<middle>.*?(?=\|))(?<end>.*)