除方括号中的斜线外,需要用/
替换所有正斜杠(>
)
输入字符串:
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/']"
答案 0 :(得分:1)
您的想法很好,但在正面使用否定。
(?<!\[[^\]]*)(\/)
更新您的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中捕获/
例如
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/']