2012-01-12 87 views
6

我试图找出一种方法来删除正则表达式中匹配前的字符串中的所有文本。我用C#编写了这个代码。例如,如果字符串是“hello,test matching”,并且模式是“test”,我希望最终结果是“测试匹配”(即在测试之前删除所有内容)。正则表达式+删除所有文本之前

有什么想法?谢谢!

编辑:在阅读您的回复(并感谢他们)之后,我应该在我的示例中更具体一些。我喜欢lookahead方法,但我简化了我的例子。为了让事情变得更加困难,通常琴弦的样子:

“你好,测试匹配测试everythingAfter”

所以,如果我使用模式“测试”,它会赶上的第一个。我的目标是在第二场比赛后替换所有文字。即:导致“测试everything.fter”....对此感到抱歉。

+2

我不是C#不够熟悉而写码。但是,请勿使用RegEx,请使用基本的字符串方法。 *搜索*找到发生,比使用* substring *捕获* *后的所有内容。 – 2012-01-12 19:33:20

+0

对于您试图删除的模式,它们总是字符串还是有时是实际的正则表达式?如果前者使用'IndexOf'和'Substring'并且避免你不需要的性能惩罚。 – 2012-01-12 19:54:56

+0

可能的重复:[从字符串中删除文本,直到达到某个字符](http://stackoverflow.com/q/8371922/299327) – 2012-11-28 15:23:06

回答

0

*更新,使用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; 
+0

请参阅上面的编辑(和评论) – keynesiancross 2012-01-12 20:22:03

+0

这是一个* lookbehind *,不是前瞻,它没有做任何有用的事情。如果''test \ s“'刚刚使用'test'后面跟着一个空格,那么''test”''后面的一个lookbehind将会成功。另外,'Singleline'选项没有效果,因为'.'元字符不在正则表达式中使用。 – 2012-01-12 20:57:16

+0

更新!解决方案确实解决了这个问题。 – Standage 2012-01-12 21:21:44

5

对于一个简单的解决方案,只需更换“开始的行什么测试”和“测试”:

newString = Regex.Replace(oldString, "^.*test", "test"); 

由于*是贪婪的,这将取代尽可能多的,即a test b test c将变为test c。要尽可能少地替换,请使用*?而不是*

如果你想避免重复搜索词,你可以使用一个Zero-width positive lookahead assertion

newString = Regex.Replace(oldString, "^.*(?=test)", ""); 
+0

这将删除'test'的* last *匹配之前的所有内容。在许多情况下,这可能并不重要,但也可能造成混淆。 – svick 2012-01-12 19:35:21

+0

实际上,当我现在阅读回复时,这正是我需要做的(请参阅上面的编辑)。我需要它匹配最后的结果,并取代之前的一切。非常感谢。 – keynesiancross 2012-01-12 20:23:02

+0

@keynesiancross:如果是这样的话,你应该接受这个答案或Heinzi的答案,*不是* Paul的答案。没有什么是个人的,保罗,但那只是偶然的工作。 – 2012-01-12 21:18:49

7

您可以使用positive lookahead匹配一个字符串,但不能捕捉到它:

(?=test) 

所以你要在最后一次测试之前捕获物质:

^.*(?=test) 

如果你想它,以便它是测试的第一次出现,使用延迟匹配:

^.*?(?=test) 
+0

Thx作为回应 - 对上述问题进行了编辑......尽管如此,我仍然喜欢这种前瞻性方法。我可以选择第二场比赛,然后展望未来吗? – keynesiancross 2012-01-12 20:21:52

+0

如何在事件发生后捕获所有内容? – user1040975 2017-07-18 18:01:19

相关问题