正则表达式来替换字符串,但方括号除外

时间:2019-10-19 15:56:43

标签: c# regex

除方括号中的斜线外,需要用/替换所有正斜杠(>

输入字符串:

string str = "//div[1]/li/a[@href='https://www.facebook.com/']";

尝试过的模式(无效):

string regex = @"\/(?=$|[^]]+\||\[[^]]+\]\/)";
var pattern = Regex.Replace(str, regex, ">");

预期结果:

">>div[1]>li>a[@href='https://www.facebook.com/']"

3 个答案:

答案 0 :(得分:1)

您的想法很好,但在正面使用否定。

(?<!\[[^\]]*)(\/)

Demo

更新您的C#代码后

string pattern = @"(?<!\[[^\]]*)(\/)";
string input = "//div[1]/li/a[@href='https://www.facebook.com/']";
var result = Regex.Replace(input, pattern, ">");

您会得到

>>div[1]>li>a[@href='https://www.facebook.com/']

答案 1 :(得分:0)

如果您还愿意使用String.Replace,则可以执行以下操作:

string input = "//div[1]/li/a[@href='https://www.facebook.com/']";
        string expected = ">>div[1]>li>a[@href='https://www.facebook.com/']";

        var groups = Regex.Match(input, @"^(.*)(\[.*\])$")
             .Groups
             .Cast<Group>()
             .Select(g => g.Value)
             .Skip(1);
        var left = groups.First().Replace('/', '>');
        var right = groups.Last();
        var actual = left + right;

        Assert.Equal(expected, actual);

这是将string分成两个groups,对于第一个组,/>所取代。第二个group照原样追加。基本上,您不在乎方括号之间是什么。

Assert来自xUnit单元测试。)

答案 2 :(得分:0)

您可以从开头到结尾的方括号匹配,或者将/捕获到捕获组中。

在替换中,将/替换为<

模式

\[[^]]+\]|(/)
  • \[[^]]+\]从打开[到结束]
  • 的比赛
  • |
  • (/)在组1中捕获/

Regex demo | C# demo

例如

string str = "//div[1]/li/a[@href='https://www.facebook.com/']";
string regex = @"\[[^]]+\]|(/)";
str = Regex.Replace(str, regex, m => m.Groups[1].Success ? ">" : m.Value);
Console.WriteLine(str);

输出

>>div[1]>li>a[@href='https://www.facebook.com/']