我试图将一个括号保留在一个被括号括起来的字符串中。
有问题的字符串是: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)
应该成为:
herpdediderp
,orange,(hmm)
,some other crap
和red,hmm
。
该代码适用于除双括号外的所有内容:(orange,(hmm))
至orange,(hmm)
。
答案 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'猜测在这里 - 从我和其他人。你可以试试
[^(]+|\([^(]*(?:\([^(]*\)[^(]*)*\)
它处理一个级别的括号递归(虽然可以扩展)。
Visual illustration at regex101
如果这引起了你的兴趣,我会添加一个解释;)
修改强>
如果您需要使用拆分,请将选择放入一个组,例如
([^(]+|\([^(]*(?:\([^(]*\)[^(]*)*\))
并过滤掉空字符串。请参见示例here at ideone。
编辑2:
不太确定您想要多个括号级别的行为,但我认为这可以为您做到:
([^(]+|\([^(]*(?:\([^(]*(?:\([^(]*\)[^(]*)*\)[^(]*)*\))
^^^^^^^^^^^^^^^^^^^ added
对于您想要的每个级别的递归,您只需"添加另一个内在级别。所以这是两个级别的递归;)
答案 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