Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 用正则表达式匹配前面没有另一个字符串的字符串_.net_Regex - Fatal编程技术网

.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)
。以防有人看到