c# - 一次性替换(反转)左括号和右括号

标签 c# regex

解决方案应该很简单,但仍然很困难。我如何反转分组符号,如方括号、圆括号、大括号...

我的字符串是这样的:Lorem ipsum dolor )sit amet(, consectetur ]adipiscing[ elit

我希望输出为 Lorem ipsum dolor (sit amet), consectetur [adipiscing] elit

关键是如果我在多次传递中一个符号一个符号地变换,它会被变换两次:

text = text.Replace('[', ']');
text = text.Replace(']', '[');
text = text.Replace('(', ')');
text = text.Replace(')', '(');

结果是 Lorem ipsum dolor (sit amet(, consectetur [adipiscing[ elit

如何一次性转换文本?

最佳答案

古人会做...你一个字符一个字符地重建字符串...

string str = "Lorem ipsum dolor )sit amet(, consectetur ]adipiscing[ elit";

var sb = new StringBuilder(str.Length);

foreach (char ch in str)
{
    switch (ch)
    {
        case '[':
            sb.Append(']');
            break;
        case ']':
            sb.Append('[');
            break;
        case '(':
            sb.Append(')');
            break;
        case ')':
            sb.Append('(');
            break;
        default:
            sb.Append(ch);
            break;
    }
}

string str2 = sb.ToString();

或者您可以开始混淆 C# 的类(class):-)

string str3 = new Regex(@"[\[\]()]")
    .Replace(str, x => ((char)(x.Value[0] + (x.Value == "[" || x.Value == "(" ? 
        1 + (x.Value[0] / '[') : 
        -1 - (x.Value[0] / '[')))).ToString());

关于c# - 一次性替换(反转)左括号和右括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29770615/

相关文章:

c# - 在运行时更改 Windows 窗体窗体的宽度

regex - 仅用于两位数月份和两位数日期的正则表达式

c# - 在 WPF 中折叠网格行

c# - 连一个简单的方法都无法内联(?)

c# - 在同一 CryptoStream 上使用 BinaryReader 和 BinaryWriter 时如何避免超时?

regex - 如何使用正则表达式查找并删除文件中的重复行?

regex - Grep 正则表达式不包含字符串

c# - 底层连接已关闭 : An unexpected error occurred

regex - 不甘心回头看

regex - Gulp:如何匹配所有图像文件类型