如何在括号内括起来

时间:2018-02-23 23:57:01

标签: c# regex

我试图将一个括号保留在一个被括号括起来的字符串中。

有问题的字符串是:test (blue,(hmmm) derp)

数组中所需的输出为:test(blue,(hmmm) derp)

当前输出为:(blue,(hmm)derp)

我目前的代码是this

var input = Regex
  .Split(line, @"(\([^()]*\))")
  .Where(s => !string.IsNullOrEmpty(s))
  .ToList();

如何在外部括号中提取文本(保留它们)并将内部括号保留为数组中的一个字符串?

修改

为了澄清我的问题,我想忽略内括号,只在外括号上分开。

herpdediderp (orange,(hmm)) some other crap (red,hmm)

应该成为:

herpdediderporange,(hmm)some other crapred,hmm

该代码适用于除双括号外的所有内容:(orange,(hmm))orange,(hmm)

3 个答案:

答案 0 :(得分:4)

您可以使用方法

public string Trim(params char[] trimChars)

喜欢这个

string trimmedLine = line.Trim('(', ')'); // Specify undesired leading and trailing chars.

// Specify separator characters for the split (here command and space):
string[] input = trimmedLine.Split(new[]{',', ' '}, StringSplitOptions.RemoveEmptyEntries);

如果该行可以以2个连续的括号开头或结尾,那么只需使用旧的if语句:

if (line.StartsWith("(")) {
    line = line.Substring(1);
}
if (line.EndsWith(")")) {
    line = line.Substring(0, line.Length - 1);
}
string[] input = line.Split(new[]{',', ' '}, 

答案 1 :(得分:2)

Lot'猜测在这里 - 从我和其他人。你可以试试

[^(]+|\([^(]*(?:\([^(]*\)[^(]*)*\)

它处理一个级别的括号递归(虽然可以扩展)。

Here at regexstorm

Visual illustration at regex101

如果这引起了你的兴趣,我会添加一个解释;)

修改

如果您需要使用拆分,请将选择放入一个组,例如

([^(]+|\([^(]*(?:\([^(]*\)[^(]*)*\))

并过滤掉空字符串。请参见示例here at ideone

编辑2:

不太确定您想要多个括号级别的行为,但我认为这可以为您做到:

([^(]+|\([^(]*(?:\([^(]*(?:\([^(]*\)[^(]*)*\)[^(]*)*\))
                        ^^^^^^^^^^^^^^^^^^^ added

对于您想要的每个级别的递归,您只需"添加另一个内在级别。所以这是两个级别的递归;)

See it here at ideone

答案 2 :(得分:1)

希望有人会想出一个正则表达式。这是我的代码答案。

static class ExtensionMethods
{
    static public IEnumerable<string> GetStuffInsideParentheses(this IEnumerable<char> input)
    {
        int levels = 0;
        var current = new Queue<char>();
        foreach (char c in input)
        {
            if (levels == 0)
            {
                if (c == '(') levels++;
                continue;
            }
            if (c == ')')
            {
                levels--; 
                if (levels == 0)
                { 
                    yield return new string(current.ToArray()); 
                    current.Clear();
                    continue;
                }
            }
            if (c == '(')
            {
                levels++; 
            }
            current.Enqueue(c); 
        }
    }
}

测试程序:

public class Program
{
    public static void Main()
    {

        var input = new []
        {
            "(blue,(hmmm) derp)", 
            "herpdediderp (orange,(hmm)) some other crap (red,hmm)"
        };

        foreach ( var s in input )
        {
            var output = s.GetStuffInsideParentheses();
            foreach ( var o in output )
            {
                Console.WriteLine(o);
            }
            Console.WriteLine();
        }
    }
}

输出:

blue,(hmmm) derp

orange,(hmm)
red,hmm

Code on DotNetFiddle