.net 用正则表达式匹配前面没有另一个字符串的字符串
声明.net 用正则表达式匹配前面没有另一个字符串的字符串,.net,regex,.net,Regex,声明 Regex.Replace("XB", "([^A])B", "$1AB") 按预期生成XAB。有人能解释一下原因吗 Regex.Replace("XBB", "([^A])B", "$1AB") 是否不产生XABAB,而是产生XABB?这就像正则表达式解析器在到达第二个B时不再知道前一个字符的边界一样 最后,我想用AB替换前面没有a的所有Bs,注意这个([^a])Bregex匹配第一个XB并捕获X。因为X后面的B已经存在于匹配中,所以下次不会匹配。在这种情况下,我建议您使用looka
Regex.Replace("XB", "([^A])B", "$1AB")
按预期生成XAB
。有人能解释一下原因吗
Regex.Replace("XBB", "([^A])B", "$1AB")
是否不产生XABAB
,而是产生XABB
?这就像正则表达式解析器在到达第二个B时不再知道前一个字符的边界一样
最后,我想用AB替换前面没有a
的所有B
s,注意这个([^a])B
regex匹配第一个XB
并捕获X
。因为X
后面的B
已经存在于匹配中,所以下次不会匹配。在这种情况下,我建议您使用lookarounds
([^A])(?=B)
(?=B)
正向前瞻,断言匹配后必须跟字母B
但当替换字符串为$1AB
时,它会生成XABBABB
。要获得所需的输出,只需从替换字符串中删除B
。即用\1A
请注意,此([^A])B
正则表达式与第一个XB
匹配,并捕获X
。因为X
后面的B
已经存在于匹配中,所以下次不会匹配。在这种情况下,我建议您使用lookarounds
([^A])(?=B)
(?=B)
正向前瞻,断言匹配后必须跟字母B
但当替换字符串为$1AB
时,它会生成XABBABB
。要获得所需的输出,只需从替换字符串中删除B
。即用\1A
所有B前面都没有a和AB。
查找:(?
替换:AB
所有B的前面没有a加AB。
查找:(?
替换:AB
在.NET正则表达式风格中,可以使用如下lookbehind:
匹配foo
前面不紧跟bar
(?<!bar)foo
(?s)(?<!bar.*?)foo
(?<=bar)foo
(?s)(?<=bar.*?)foo
看
匹配foo
前面紧跟bar
(?<!bar)foo
(?s)(?<!bar.*?)foo
(?<=bar)foo
(?s)(?<=bar.*?)foo
看
后者包含负向后看的*?
,允许正则表达式引擎检查条以及紧靠foo
左侧的任何零个或多个字符,因此条不必紧靠foo
(?s)
内联修饰符允许
匹配任何字符,包括换行符
当前的问题很容易通过使用负回溯来解决(参见顶部场景)
var result=Regex.Replace(“XBB”)和“(?在.NET Regex风格中,可以使用如下lookbehind:
匹配foo
前面不紧跟bar
(?<!bar)foo
(?s)(?<!bar.*?)foo
(?<=bar)foo
(?s)(?<=bar.*?)foo
看
匹配foo
前面紧跟bar
(?<!bar)foo
(?s)(?<!bar.*?)foo
(?<=bar)foo
(?s)(?<=bar.*?)foo
看
后者包含负向后看的*?
,允许正则表达式引擎检查条以及紧靠foo
左侧的任何零个或多个字符,因此条不必紧靠foo
(?s)
内联修饰符允许
匹配任何字符,包括换行符
当前的问题很容易通过使用负回溯来解决(参见顶部场景)
var result=Regex.Replace(“XBB”(?我编辑我的问题是为了澄清我的目标。我想得到XABBABB
。根据你的建议,我得到XABBABB
。我编辑我的问题是为了澄清我的目标。我想得到XABAB
。根据你的建议,我得到XABBABB
。你选择的答案不会真的起作用。为了将来的参考,我会等待一段时间,等待其他answ。)呃。你选择的答案不会真的起作用。为了将来的参考,我会等一段时间寻找其他答案。这看起来确实不错。它比我接受的答案更简单、更符合逻辑。你能举一个例子说明@Avinash的解决方案失败了,而你的解决方案有效吗?@Françoisbaune:这和另一个答案之间有一个区别:这答案将替换字符串开头的B
,而另一个答案不会。不过,您不太清楚在这种情况下会发生什么。事实上,我不得不使用([^A]|^)(?=B)
使其在字符串开头也起作用。您的解决方案更简单、更清晰。此答案中的模式便于将Unix换行符文本转换为DOS/Windows换行符文本,调整如下:(?请注意,即使现在2021 safari仍然不支持查找功能。这看起来确实不错。它比我接受的答案更简单、更符合逻辑。你能举一个例子说明@Avinash的解决方案在你的解决方案有效时失败了吗?@Françoisbaune:这个答案和另一个答案之间有一个区别:这个答案将取代B
在字符串开头,而另一个答案不是。不过,您不太清楚在这种情况下会发生什么。事实上,我不得不使用([^A]|^)(?=B)
使其在字符串开头也起作用。您的解决方案更简单、更清晰。此答案中的模式便于将Unix换行符文本转换为DOS/Windows换行符文本,调整如下:(?请注意,即使现在2021 safari仍然不支持lookbehind功能。我知道最初的答案是关于.NET的,但是有没有办法实现(?使用PCRE时没有“lookbehind断言不是固定长度”错误的行为?@IvanShatsky是的,使用bar.*foo(*SKIP)(*F)| foo
甚至bar.*foo(*SKIP)(*F)|foo
哇,非常感谢,以前不知道(*SKIP)
或(*F)
。以防有人看到