我正试图找出一种在Regex中匹配之前删除字符串中所有文本的方法。我用C#编写代码。
例如,如果字符串是“hello,test matching”,并且模式是“test”,我希望最终结果是“test matching”(即在测试之前删除所有内容)。
有什么想法?谢谢!
编辑:在阅读你的回复之后我可能应该在我的例子中更具体一点(并感谢他们)。我喜欢前瞻方法,但我过度简化了我的例子。为了使事情变得更加困难,通常字符串看起来像:
“你好,测试匹配测试一切后”
因此,如果我使用模式“test”,它将捕获第一个。我的目标是在第二场比赛后替换所有文字。即:导致“测试一切后”......对此抱歉。
答案 0 :(得分:8)
您可以使用positive lookahead匹配字符串但不捕获字符串:
(?=test)
所以你想在最后一次测试之前捕获这些东西:
^.*(?=test)
如果你想让它成为第一次出现的测试,请使用延迟匹配:
^.*?(?=test)
答案 1 :(得分:5)
对于一个简单的解决方案,只需将“ start-of-line 任何测试”替换为“test”:
newString = Regex.Replace(oldString, "^.*test", "test");
由于*
贪婪,这将尽可能地取代,即a test b test c
将成为test c
。要尽可能少地替换,请使用*?
代替*
。
如果您想避免重复搜索词,可以使用Zero-width positive lookahead assertion:
newString = Regex.Replace(oldString, "^.*(?=test)", "");
答案 2 :(得分:1)
*使用matchcollection
更新string test = "hello, test matching";
string regexStrTest;
regexStrTest = @"test\s\w+";
MatchCollection m1 = Regex.Matches(test, regexStrTest);
//gets the second matched value
string value = m1[1].Value;