【问题标题】:Regular Expression to divide a string with pipe-delimited into multiple groups正则表达式将带有管道分隔的字符串分成多个组
【发布时间】:2013-01-15 05:40:52
【问题描述】:

我正在编写一个将字符串分成两个不同组的 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|"
    • 中间=“5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w”
    • end = "|123456789|123456789"

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

【问题讨论】:

  • 5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w 是否出现在您的每个字符串中?你不考虑||两个管道?
  • 任何原因string.Split('|') 不起作用?

标签: c# regex


【解决方案1】:

你应该使用String.Split

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

它会做的是给你数组

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

5GOdNF7Q5fK5O9QKiZefJEfO1YECcX1w 将位于sarray[5]

【讨论】:

  • Split 肯定会起作用。但是,我需要在此任务中编写正则表达式。是的,||被认为是两个管道。谢谢。
  • 这不是家庭作业。这是我工作的一部分,但是,我对正则表达式很陌生。谢谢
  • @Andy 我问的原因是因为你说你是"required to X" 为什么一定要用正则表达式?
  • 是的,我的公司已经有了一个系统,它采用正则表达式来解析文本文件;如果我有选择,我会使用我不太熟悉正则表达式的 split 函数。
【解决方案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;
}

【讨论】:

  • 根据 Rhumborl 的评论,我使我的选择更加简洁。
  • @user1775603 不幸的是仍然无法正常工作。我之前试图为你调整它,但没有运气。在regexlib.com/RETester.aspx 或类似网站上进行测试。
  • @user1775603:试试这个^((.*?[|]){4})(.*?)([|].*)*$ 你需要包装那个重复的组,让它不贪心。
  • 现在看起来不错。也许只需设置显式捕获并标记您想要的组:^(?&lt;begin&gt;(.*?[|]){4})(?&lt;middle&gt;.*?)(?&lt;end&gt;[|].*)*$
  • 感谢各位的帮助。现在看起来不错,我学到了一些东西。
【解决方案3】:

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

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

【讨论】:

  • 或更简洁的(?&lt;begin&gt;([^|]*\|){4})(?&lt;middle&gt;[^|]*)(?&lt;end&gt;\|.*)
【解决方案4】:

您可以使用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"

【讨论】:

    【解决方案5】:

    这是另一个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多