2011-04-29 65 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 
*/ 
相关问题