C# 使用正则表达式删除[]中的标记

C# 使用正则表达式删除[]中的标记,c#,regex,C#,Regex,作为一个例子,我有这个内容 <tag1><tag2>Test</tag2>[<tag3>[<tag4>TAB1</tag4>]</tag3>]</tab1> <tag1><tag2>Test</tag2>[<tag3>[<tag5></tag5><tag4>TAB2</tag4>]</tag3>

作为一个例子,我有这个内容

<tag1><tag2>Test</tag2>[<tag3>[<tag4>TAB1</tag4>]</tag3>]</tab1>
<tag1><tag2>Test</tag2>[<tag3>[<tag5></tag5><tag4>TAB2</tag4>]</tag3>]</tab1>

使用正则表达式是一个很好的解决方案,但它比刚才编写的方法慢3倍左右:

    static string removeTagsInBrackets(string input)
    {            
        StringBuilder sb = new StringBuilder(input.Length);
        bool insideBrackets = false;
        bool insideTag = false; char c;
        int indexOfLast = input.LastIndexOf(']');
        for (int i = 0; i < input.Length; i++)
        {
            c = input[i];
            if (c == '[') { insideBrackets = true; sb.Append(c); continue; }
            if (i == indexOfLast) { insideBrackets = false; sb.Append(c); continue; }
            if (c == '<' || c == '>') { insideTag = !insideTag; }
            if (insideBrackets) if (insideTag || (!insideTag && c == '>')) continue;
            sb.Append(c);
        }
        return sb.ToString();
    }
静态字符串移除标记括号(字符串输入)
{            
StringBuilder sb=新的StringBuilder(输入长度);
bool-insideBrackets=false;
bool insideTag=false;字符c;
int indexOfLast=input.LastIndexOf(']');
for(int i=0;i
用法:

        string s = @"<tag1><tag2>Test</tag2>[<tag3>[<tag5></tag5><tag4>TAB2</tag4>]</tag3>]</tab1>";
        var result = removeTagsInBrackets(s);
        Console.WriteLine(result);
string s=@“Test[[TAB2]]”;
var结果=拆除支架;
控制台写入线(结果);
输出:
Test[[TAB2]]


另请检查:

var regex=new regex(@)(?一种方法是查找最外层的方括号,并仅删除匹配部分中的标记

要做到这一点,您需要使用查找嵌套(或非嵌套)括号中的子字符串。然后,您只需将替换委托给一个具有而不是固定字符串的函数

public static void Main()
{
    string html = "<tag1><tag2>Test</tag2>[<tag3>[<tag4>TAB1</tag4>]</tag3>]</tab1>\n"
                + "<tag1><tag2>Test</tag2>[<tag3>[<tag5></tag5><tag4>TAB2</tag4>]</tag3>]</tab1>";

    string pattern = @"\[(?>[^][]+|(?<open>\[)|(?<close-open>]))*(?(open)(?!))]";
    MatchEvaluator evaluator = new MatchEvaluator(RemoveTags);

    Console.WriteLine(Regex.Replace(html, pattern, evaluator));      
}

public static string RemoveTags(Match match)
{
    return Regex.Replace(match.Value, @"<[^>]*>", string.Empty);   
}
publicstaticvoidmain()
{
string html=“Test[[TAB1]]\n”
+“测试[[TAB2]]”;
字符串模式=@“\[(?>[^][]+|(?\[)|(?]))*(?(打开)(?!)]”;
MatchEvaluator evaluator=新的MatchEvaluator(移除标签);
WriteLine(Regex.Replace(html,pattern,evaluator));
}
公共静态字符串移除标记(匹配)
{
返回Regex.Replace(match.Value,@“]*>”,string.Empty);
}
另一种性能更高的方法(因为C是一种编译语言)就是用基本的字符串操作编写您自己的字符串解析器。您只需要一个计数器就可以知道方括号何时平衡。当发现一个开始的括号时,您会增加计数器,当发现一个结束的括号时,您会减少计数器,当计数器等于零时,括号会平衡。(请注意,这或多或少是平衡组模式所做的)。

我尝试使用这个Regex.Replace(text,“,string.Empty)。这将删除所有标记。我只需要删除[]中的标记
    static string removeTagsInBrackets(string input)
    {            
        StringBuilder sb = new StringBuilder(input.Length);
        bool insideBrackets = false;
        bool insideTag = false; char c;
        int indexOfLast = input.LastIndexOf(']');
        for (int i = 0; i < input.Length; i++)
        {
            c = input[i];
            if (c == '[') { insideBrackets = true; sb.Append(c); continue; }
            if (i == indexOfLast) { insideBrackets = false; sb.Append(c); continue; }
            if (c == '<' || c == '>') { insideTag = !insideTag; }
            if (insideBrackets) if (insideTag || (!insideTag && c == '>')) continue;
            sb.Append(c);
        }
        return sb.ToString();
    }
        string s = @"<tag1><tag2>Test</tag2>[<tag3>[<tag5></tag5><tag4>TAB2</tag4>]</tag3>]</tab1>";
        var result = removeTagsInBrackets(s);
        Console.WriteLine(result);
var regex = new Regex(@"(?<=\[)(</?tag\d>)+|(</?tag\d>)+(?=\])");

var src1 = "<tag1><tag2>Test</tag2>[<tag3>[<tag4>TAB1</tag4>]</tag3>]</tab1>";
var src2 = "<tag1><tag2>Test</tag2>[<tag3>[<tag5></tag5><tag4>TAB2</tag4>]</tag3>]</tab1>";

var result1 = regex.Replace(src1, "");
var result2 = regex.Replace(src2, "");
public static void Main()
{
    string html = "<tag1><tag2>Test</tag2>[<tag3>[<tag4>TAB1</tag4>]</tag3>]</tab1>\n"
                + "<tag1><tag2>Test</tag2>[<tag3>[<tag5></tag5><tag4>TAB2</tag4>]</tag3>]</tab1>";

    string pattern = @"\[(?>[^][]+|(?<open>\[)|(?<close-open>]))*(?(open)(?!))]";
    MatchEvaluator evaluator = new MatchEvaluator(RemoveTags);

    Console.WriteLine(Regex.Replace(html, pattern, evaluator));      
}

public static string RemoveTags(Match match)
{
    return Regex.Replace(match.Value, @"<[^>]*>", string.Empty);   
}