我有一个字符串:
AAA foobarfoobarfoobar foo baar bar foo BBB and so on
替换后它应该像:
AAA foobarfoobarfoobar foo baar bar foo
基本上BBB及其背后的一切都将被剥夺。所以我的第一个想法就像是:
BBB.*
这实际上是工作。但我只希望这个工作,如果BBB支持AAA,那么
BBB bbb AAA aaa BBB ccc
将被替换为
BBB bbb AAA aaa
第一个BBB留下来因为前面没有AAA。
我的想法是像
这样的表达AAA.*?BBB.*
这符合我认为的正确部分,但它也会杀死整个事物。所以我知道有占位符或什么,但无法找到如何正确使用它们。这是怎么做到的?
答案 0 :(得分:2)
你可以使用lookbehind:
(?<=AAA.*?)BBB.*$
将确保AAA
位于BBB
之前。快速测试:
PS> 'BBB bbb AAA aaa BBB ccc' -replace 'AAA.*?BBB.*$'
BBB bbb
PS> 'BBB bbb AAA aaa BBB ccc' -replace '(?<=AAA.*)BBB.*$'
BBB bbb AAA aaa
答案 1 :(得分:1)
尝试这样的事情
(?<=AAA.*?)BBB.*
(?<=AAA.*)
是断言的背后,.net能够在没有长度限制的情况下处理它们,所以它应该适合你。
另一种解决方案是
(AAA.*?)BBB.*
并替换为捕获组1中的内容
答案 2 :(得分:0)
我不知道c#实现这些功能的程度,但您可以使用
积极的后视找到匹配并且不替换它 http://www.regular-expressions.info/lookaround.html
或者您可以存储(AAA。*)部分并将其插入替换