2012-01-12 95 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

相關問題