使用RegEx将括号内的括号更改为括号

时间:2014-01-22 19:15:49

标签: c# regex

我的起始字符串如下所示:

This is (a test) of (something (cool like) this and) stuff like ((that and) stuff) yeah.

我希望将其转化为:

This is (a test) of (something [cool like] this and) stuff like ([that and] stuff) yeah.

括号内的任何括号都需要更改为方括号[]。其他任何东西都保持不变。它不需要递归,只会像示例中那样深一层......如果这有帮助。

到目前为止,我的字符串函数我只能找到第一个括号,所以我真的没有示例代码。 : - /

static String CorrectBrackets(String stringToCorrect)
{

    int firstParenIdx = stringToCorrect.IndexOf('(');

    return stringToCorrect;
}

另外,如果可以在没有RegEx的情况下完成,我就可以了!

4 个答案:

答案 0 :(得分:1)

事实上,这可以在没有RegEx的情况下以非常简单的方式完成:

迭代所有字符并记住括号的嵌套级别。如果您已经处于嵌套级别1并找到任何其他开括号或右括号,请替换它们。

未经测试,但有希望说明:

static string CorrectBrackets(string strString)
{
    var result = new System.Text.StringBuilder(strString);
    int bracketLevel = 0;
    for (int i = 0; i < result.Length; i++) {
        switch (result[i]) {
            case '(':
                bracketLevel++;
                if (bracketLevel >= 2) {
                    result[i] = '[';
                }
                break;
            case ')':
                bracketLevel--;
                if (bracketLevel >= 1) {
                    result[i] = ']';
                }
                break;
    }
    return result.ToString();
}

答案 1 :(得分:1)

如果您不想使用正则表达式,它会执行此操作,它会计算缩进级别,如果缩进级别大于1,则使用方括号切换括号。

private static string CorrectBrackets(string text)
{
    StringBuilder builder = new StringBuilder(text);
    int nestingLevel = 0;
    for (int i = 0; i < builder.Length; i++)
    {
        switch (builder[i])
        {
            case '(':
                if (nestingLevel > 0) builder[i] = '[';
                nestingLevel++;
                break;
            case ')':
                if (nestingLevel > 1) builder[i] = ']';
                nestingLevel--;
                break;
            default: break;
        }
    }
    return builder.ToString();
}

答案 2 :(得分:1)

这应该这样做:

static readonly Regex regex = new Regex(@"\([^\(^\).]*(?<bracket>\([^\(^\).]+\))[^\(^\).]*\)");

static string ReplaceInnerParens(Match match)
{
    return match.Value.Replace(match.Groups["bracket"].Value, "[" + match.Groups["bracket"].Value.Substring(1, match.Groups["bracket"].Value.Length - 2) + "]");
}

static string Replace(string input)
{
    return regex.Replace(input, new MatchEvaluator(ReplaceInnerParens));
}

void Main() {
    Console.WriteLine(Replace("This is (a test) of (something (cool like) this and) stuff like ((that and) stuff) yeah."));
}

答案 3 :(得分:1)

您也可以使用此正则表达式:

(?<=\().*(?<bracket>\([^\(]*\)).*(?=\))

带有Ungreedy旗帜。

你应该用[和]

替换组“括号”替换第一个和最后一个字符