2011-04-29 239 views
13

我需要一個正則表達式,該單詞在特定的單詞之前和之後給出單詞,包括搜索單詞本身。正則表達式在一個特定的單詞之前和之後找到一個單詞

像:「這是要找到一個詞一些虛擬文本」應該給我的字符串「虛擬文本爲」當文本是我的搜索詞。

另一個問題是,提供的字符串可能包含多於一次的搜索詞,因此我必須能夠使用C#檢索該字符串中的所有匹配項。

像「這是找到一個字符串充滿文字和文字一句話一些虛擬文本」 應返回:

  • 「虛擬文本爲」
  • 「與文本和」

編輯:其實我應該有返回包含搜索詞的所有匹配。 幾個例子: 文字太讀。 - >文字是

閱讀我的文字。 - >我的文字

這是一個文本字段示例 - >文本字段示例

+0

而如果字符串是「我需要將文本文本添加到虛擬文件」呢?它應該返回「文本文本」和「文本文本」? – 2011-04-29 13:32:04

+0

確實,只是我的搜索詞前後的單詞,無論它可能是:) – PitAttack76 2011-04-29 13:39:00

+0

怎麼樣''一個文本兩個文本三''?即你是否需要處理重疊的比賽? – ridgerunner 2011-04-29 19:44:24

回答

15

編輯:

如果你想搶從空間第一個字前向空間中的所有內容單詞後使用:

(?:\S+\s)?\S*text\S*(?:\s\S+)? 

一個簡單的測試:

string input = @" 
    This is some dummy text to find a word in a string full with text and words 
    Text is too read 
    Read my text. 
    This is a text-field example 
    this is some dummy [email protected] to read"; 

var matches = Regex.Matches(
    input, 
    @"(?:\S+\s)?\S*text\S*(?:\s\S+)?", 
    RegexOptions.IgnoreCase 
); 

這些匹配是:

dummy text to 
with text and 
Text is 
my text. 
a text-field example 
dummy [email protected] to
+0

看起來不錯!但是如果在詞的前後還有其他字符呢?像@或。或某事。是否有可能從第一個單詞之前的空間中抓取所有內容到該單詞之後的空格?所以「這是一個假的[email protected]來讀取」會「仍然會導致」dummy [email protected]「,但這樣所有其他字符和單詞都包含在內。Sry爲這樣的痛苦,或者我必須解決這沒有正則表達式? – PitAttack76 2011-04-29 19:07:17

+0

我希望整個字符串之前的文本之間和文本...,我怎麼能做到這一點 – Anjali 2013-10-02 14:22:27

+0

@亞歷克斯可以檢查這個問題http://stackoverflow.com/questions/19131758/how-to-split-a -string - 進入 - 一個陣列-的串 – Anjali 2013-10-02 14:26:23

1
([A-z]+) text ([A-z]+) 

會做很好

+3

'[A-Z]'比你想象的要多。你至少需要[A-Za-z](這對於包含非ASCII字符的單詞仍然會失敗......)。 – 2011-04-29 14:09:08

2
/[A-Za-z'-]+ text [A-Za-z'-]+/ 

在大多數情況下,包括連字符和複合詞工作。

+0

thx,那很快。你能告訴我C#行來使用這個正則表達式嗎?謝謝! – PitAttack76 2011-04-29 13:40:03

+0

我不是C#程序員,但[MSDN文檔](http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex。aspx#Y6404)有一個非常徹底的例子,說明如何在C#中使用正則表達式,這對您應該是非常有用的。 – eykanal 2011-04-29 13:42:28

6
//I prefer this style for readability 

string pattern = @"(?<before>\w+) text (?<after>\w+)"; 
string input = "larry text bob fred text ginger fred text barney"; 
MatchCollection matches = Regex.Matches(input, pattern); 

for (int i = 0; i < matches.Count; i++) 
{ 
    Console.WriteLine("before:" + matches[i].Groups["before"].ToString()); 
    Console.WriteLine("after:" + matches[i].Groups["after"].ToString()); 
} 

/* Output: 
before:larry 
after:bob 
before:fred 
after:ginger 
before:fred 
after:barney 
*/ 
相關問題