在C#中使用多个分隔符拆分字符串

时间:2017-11-08 05:28:02

标签: c#

我在使用分隔符&&||在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)";

3 个答案:

答案 0 :(得分:6)

你应该试试这些:

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将帮助您从拆分结果中删除空条目

答案 1 :(得分:2)

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

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

并希望输出如下:

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

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

如果是这种情况,您可以使用带有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;
    }
}

正则表达式(?<=\()\w+(?=\))匹配由大写或小写字母组成的非零长度字符串,下划线或数字:\w+,后面是左括号(?<=\()的断言向前看断括号(?=\))的断言。

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

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

答案 2 :(得分:-3)

您应该尝试以下代码:

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