将一些标志与字符串中的其他标志分开

时间:2011-09-05 10:56:31

标签: c# regex string

尝试重新编辑我想拆分“(”“)”“&&” “||” 从我的字符串

我原来的问题: Separating numbers from other signs in a string 我用这个例子

string text = "(54&&1)||15";
Regex pattern = new Regex(@"\(|\)|&&|\|\||\d+");
Match match = pattern.Match(text);
while (match.Success)
{
Console.WriteLine(match.Value);
match = match.NextMatch();
}

我的问题是我并不总是得到一个只有数字和符号的正确字符串 我可能会得到一个奇怪的字符串,如:

0ò8F&|&&booBl||aBla

我希望将其分开

0ò8F&| && booBl || aBla

4 个答案:

答案 0 :(得分:2)

它不起作用的原因是,假设您在接受的答案中使用Jon Skeet提供的正则表达式,那么您不会在字符串中查找该公式。给出的正则表达式是:

\(|\)|&&|\|\||\d+

这样找:

NODE                     EXPLANATION
  \(                       '('
 |                        OR
  \)                       ')'
 |                        OR
  &&                       '&&'
 |                        OR
  \|\|                     '||'
 |                        OR
  \d+                      digits (0-9) (1 or more times (matching
                           the most amount possible))

(由http://rick.measham.id.au/paste/explain.pl提供)略有修改。

正如你所看到的,这与“&”无法匹敌或“1& 2”所以如果你需要它,你需要在正则表达式中包含这些值。

这个正则表达式依赖于你原来的陈述:

  

我有一个包含以下内容的字符串:

     

“(”“)”“&&” “||”

     

和数字(0到99999)。

字符串中失败的单个&与上述内容不匹配。事实上,您可以拥有上述四个字符串标记,然后是其他任何文本,还是存在数字和可选单&等限制?如果是这样,那么这实际上是与原始问题不同的问题......

如果您希望将这四个内容用作任意文本的分隔符,那么Regex.Split可能就是前进之路(http://msdn.microsoft.com/en-us/library/8yttk7sy.aspx).

string[] results = Regex.Split(@"(54&1&1)||15", @"(\()|(\))|(&&)|(\|\|)");

上面应该将第一个字符串拆分为四个指定的分隔符(“(”“)”“&&”“||”)并且将所有拆分字符串和分隔符本身分开。您可能遇到的一个问题是,如果两个分隔符相邻,那么您将在阵列中获得一个需要考虑的空值。

以上结果是:

0 - 
1 - (
2 - 54&1&1
3 - )
4 -  
5 - ||
6 - 15

这也不适用于.NET 1.0或1.1,但我希望这不会有问题。

应该注意的是,正则表达式已经稍微改变,将括号中的所有捕获括起来,使它们捕获组并删除仅用于不是分隔符的任何内容的\ d +组。

要从数组中删除空白条目,您只需要一行代码,如:

results = results.Where(x=>!String.IsNullOrEmpty(x)).ToArray();

当然,如果您实际上不需要它作为数组,您可以将其保留为IEnumberable或类似。

答案 1 :(得分:0)

   List<string> sList = new List<string>();
    Regex pattern = new Regex(@"\(|\)|&&|\|\||\d+");
    Match match = pattern.Match(text);
    while (match.Success)
    {
        sList.Add(match.Value);
        //Console.WriteLine(text2[nCounter]);
        match = match.NextMatch();

    }string text = "(54&&1)||15";     

sList 包含您想要的输出

答案 2 :(得分:0)

您是否尝试过我对原始问题的回答?

请参阅:Separating numbers from other signs in a string

它解决了你的问题。

var operators = new [] { "(", ")", "&&", "||", };

Func<string, IEnumerable<string>> operatorSplit = t =>
{
    Func<string, string, IEnumerable<string>> inner = null;
    inner = (p, x) =>
    {
        if (x.Length == 0)
        {
            return new [] { p, };
        }
        else
        {
            var op = operators.FirstOrDefault(o => x.StartsWith(o));
            if (op != null)
            {
                return (new [] { p, op }).Concat(inner("", x.Substring(op.Length)));
            }
            else
            {
                return inner(p + x.Substring(0, 1), x.Substring(1));
            }
        }
    };
    return inner("", t).Where(x => !String.IsNullOrEmpty(x));
};

var list = operatorSplit("0ò8F&|&&booBl||aBla").ToList();

结果:{ "0ò8F&|", "&&", "booBl", "||", "aBla" }

答案 3 :(得分:0)

这将满足您的要求:

@"\(|\)|&&|\|\||.+?(?=\(|\)|&&|\|\||$)"

它将\d+前一个模式中的.+?(?=\(|\)|&&|\|\||$)字符集替换为{{1}},它使用正向前瞻来指示引擎捕获所有内容,但不包括您的运算符令牌。