【问题标题】:regex to find a word before and after a specific word正则表达式在特定单词之前和之后查找单词
【发布时间】:2011-04-29 13:29:42
【问题描述】:

我需要一个正则表达式,它可以在特定单词之前和之后给出单词,包括搜索词本身。

喜欢:“This is some dummy text to find a word”应该给我一个字符串“dummy text to”当text是我的搜索词。

另一个问题,提供的字符串可能包含不止一次的搜索词,所以我必须能够使用 C# 检索该字符串中的所有匹配项。

像“这是一些虚拟文本,用于在包含文本和单词的字符串中查找单词” 应该返回:

  • “虚拟文本到”
  • “带有文本和”

编辑: 实际上,我应该返回包含搜索词的所有匹配项。 几个例子: 文字读得太多了。 -> 文字是

阅读我的文字。 -> 我的文字

这是一个文本字段示例 -> 一个文本字段示例

【问题讨论】:

  • 如果字符串是“我需要将文本文本发送给虚拟对象”怎么办?是否应该返回“to text text”和“text text to”?
  • 确实,只是我的搜索词前后的词,不管它是什么:)
  • "one text two text three" 怎么样?即你需要处理重叠匹配吗?

标签: c# regex


【解决方案1】:

编辑:

如果您想获取从第一个单词之前的空格到单词之后的空格的所有内容,请使用:

(?:\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 la@text.be to read";

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

匹配项是:

虚拟文本
带有文字和
文字是
我的文字。
文本字段示例
虚拟 la@text.be 到

【讨论】:

  • 看起来不错!但是如果单词之前或之后还有其他字符怎么办?喜欢 @ 或 .什么的。是否可以将所有内容从第一个单词之前的空格抓取到单词之后的空格?所以“这是一些要阅读的虚拟 la@text.be”仍然会导致“虚拟 la@text.be to”,但是这样所有其他字符和单词都包括在内。对不起,这样的痛苦。或者我必须解决这没有正则表达式?
  • 我想要整个字符串在文本之前和文本之间...,我该怎么做
  • @Alex 你能检查一下这个问题吗stackoverflow.com/questions/19131758/…
【解决方案2】:
//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
*/

【讨论】:

  • 很好,有没有一种简单的方法可以控制匹配前后的字数。假设我想要 3 个单词和 2 个单词之后?
【解决方案3】:
/[A-Za-z'-]+ text [A-Za-z'-]+/

在大多数情况下都应该有效,包括连字符和复合词。

【讨论】:

  • 谢谢,速度很快。你能告诉我使用这个正则表达式的 C# 行吗?谢谢!
  • 我不是 C# 程序员,但MSDN docs 有一个非常详尽的示例,说明如何在 C# 中使用正则表达式,这对您应该非常有用。
【解决方案4】:
([A-z]+) text ([A-z]+)

会很好

【讨论】:

  • [A-z] 匹配的次数比您想象的要多。你至少需要[A-Za-z](在包含非ASCII字符的单词上仍然会失败......)。
【解决方案5】:

[a-zA-Z]+\stext\s[a-zA-Z]+

我相信这会很好地工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多