【问题标题】:Split string with multiple separators in C#在 C# 中使用多个分隔符拆分字符串
【发布时间】:2018-04-20 16:40:19
【问题描述】:

我在 C# 中使用分隔符 &&|| 拆分字符串时遇到问题。

例如,字符串可能如下所示:

"(abc)&&(rfd)&&(5)||(hh)&&(nn)||(iu)"

代码:

string[] value = arguments.Split(new string[] { "&&" }, StringSplitOptions.None);

我需要在没有() 大括号的情况下拆分或检索数组中的值 - 我需要输出是

"abc" "rfd" "5" "nn" "iu"

我需要它在一个数组中

Dictionary<string, string> dict = new Dictionary<string, string>();
            dict.Add("a", "value1");
            dict.Add("abc", "value2");
            dict.Add("5", "value3");
            dict.Add("rfd", "value4");
            dict.Add("nn", "value5");
            dict.Add("iu", "value6");

foreach (string s in strWithoutBrackets)
{
     foreach (string n in dict.Keys)
     {
          if (s == n)
          { 
               //if match then replace dictionary value with s
          }
      }
}

 ///Need output like this
 string outputStr = "(value1)&&(value2)&&(value3)||(value4)&&(value5)||(value6)";

【问题讨论】:

  • 而预期的输出是。?
  • 为什么" &amp;&amp; " 中的&amp;&amp; 周围有空格?
  • 您可以编写自己的解析器 - 或查看正则表达式。
  • 你已经完成的工作有什么问题?
  • @John - 为什么您希望 new string[] { "&amp;&amp;" } 删除 ||()?那么你需要做什么不是很明显吗?

标签: c#


【解决方案1】:

你应该试试这些:

string inputStr = "(abc)&&(rfd)&&(5)||(hh)&&(nn)||(iu)";
string[] strWithoutAndOR = inputStr.Split(new string[] { "&&","||" }, StringSplitOptions.RemoveEmptyEntries);
string[] strWithoutBrackets = inputStr.Split(new string[] { "&&","||","(",")" }, StringSplitOptions.RemoveEmptyEntries);

看看这个working Example

根据 MSDN 文档:String.Split 返回一个字符串数组 包含此实例中由以下分隔的子字符串 指定字符串或 Unicode 字符数组的元素。分裂 方法的重载方法很少,您可以使用 String.Split Method (String[], StringSplitOptions)为此 场景,您可以在其中指定要为拆分操作引用的子字符串。 StringSplitOptions.RemoveEmptyEntries 将帮助您从拆分结果中删除空条目

【讨论】:

  • 字典 dict = new Dictionary(); dict.Add("a", "value1"); dict.Add("abc", "value2"); dict.Add("5b", "value3"); dict.Add("hh", "value4"); dict.Add("nn", "value5"); dict.Add("iu", "value6");
  • @John:嗯,你检查过我的代码,工作示例了吗?
  • foreach (string s in strWithoutBrackets) { foreach (string n in dict.Keys) { if (s == n) { //如果匹配则用 s 替换字典值 } } } ///需要像这样的输出字符串 outputStr = "(value1)&&(value2)&&(value3)||(value4)&&(value5)||(value6)";
  • 感谢它的工作原理,我只想将数组值与字典匹配并创建一个新字符串,请检查更新的问题
  • 这可能是一个不同的问题。无论如何,这有什么问题
【解决方案2】:

如果我正确理解你的问题,你有一个这样的字符串:

"(abc)&&(rfd)&&(5)||(hh)&&(nn)||(iu)"

想要这样的输出:

"(value1)&&(value2)&&(value3)||(value4)&&(value5)||(value6)"

通过在您提供的字典中查找匹配的字符串(例如 "abc")来找到每个 value* 值。

如果是这种情况,您可以使用带有 MatchEvaluator 的正则表达式来进行字典查找。

class Program
{
    private static Dictionary<string, string> _dict = new Dictionary<string, string>
    {
        {"a", "value1"},
        {"abc", "value2"},
        {"5", "value3"},
        {"rfd", "value4"},
        {"nn", "value5"},
        {"iu", "value6"}
    };

    private static void Main(string[] args)
    {
        string input = "(abc)&&(rfd)&&(5)||(hh)&&(nn)||(iu)";

        string output = Regex.Replace(input, @"(?<=\()\w+(?=\))", Lookup);

        Console.WriteLine(output);
    }

    private static string Lookup(Match m)
    {
        string result;
        _dict.TryGetValue(m.Value, out result);
        return result;
    }
}

正则表达式 (?&lt;=\()\w+(?=\)) 匹配由大小写字母、下划线或数字组成的非零长度字符串:\w+,左括号 (?&lt;=\() 的后视断言和右括号的前瞻断言括号(?=\))

请注意,输入字符串"hh" 中匹配的字符串之一不在您提供的字典中。在这种情况下,我选择返回null,您可能希望抛出异常或以其他方式处理此类错误。

在简单的情况下,MatchEvaluator 可以替换为 lambda 表达式。

【讨论】:

    【解决方案3】:

    你应该试试这个代码:

    string value = "(abc)&&(rfd)&&(5)||(hh)&&(nn)||(iu)";
    string[] splitVal = value.Split(new string[] { "&&", "||" },StringSplitOptions.None);
    

    【讨论】:

    • 它不符合 OP 的要求。为什么你有string[] a = splitVal;;
    • string[] a 仅用于测试目的。现在是正确的。
    • 您的回答仍然没有达到 OP 的要求。
    猜你喜欢
    • 2016-11-17
    • 2015-06-29
    • 1970-01-01
    • 2018-02-27
    • 2018-08-18
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多