如何使用正则表达式在特定字符串/字符后找到字符串

时间:2009-01-18 00:56:17

标签: c# regex

我对正则表达式(c#)绝望,所以我很感激一些帮助:

Basicaly我需要解析一个文本,我需要在文本中找到以下信息:

示例文字:

KeywordB:*** TextToFind *其余部分不相关,但** KeywordB: 文字ToFindB ,然后是更多文字。

我需要在某个关键字之后找到可能以“:”结尾的单词。

[UPDATE]

感谢Andrew和Alan:很抱歉重新打开这个问题,但正则表达式中缺少一个重要的东西。正如我在上一篇评论中所写,作为正则表达式的一部分,是否有可能有变量(要查找的单词数,具体取决于关键字)?

或者:我可以为每个关键字设置一个不同的正则表达式(只会是手工填充)。但仍然不知道如何在正则表达式中使“要寻找的词”不变

3 个答案:

答案 0 :(得分:4)

基本的正则表达式是:

var pattern = @"KeywordB:\s*(\w*)";
    \s* = any number of spaces
    \w* = 0 or more word characters (non-space, basically)
    ()  = make a group, so you can extract the part that matched

var pattern = @"KeywordB:\s*(\w*)";
var test = @"KeywordB: TextToFind";
var match = Regex.Match(test, pattern);
if (match.Success) {
    Console.Write("Value found = {0}", match.Groups[1]);
}

如果你在一条线上有多个这样的线路,你可以使用它:

var test = @"KeywordB: TextToFind KeyWordF: MoreText";
var matches = Regex.Matches(test, @"(?:\s*(?<key>\w*):\s?(?<value>\w*))");
foreach (Match f in matches ) {
    Console.WriteLine("Keyword '{0}' = '{1}'", f.Groups["key"], f.Groups["value"]);
}

另外,请在此处查看正则表达式设计器:http://www.radsoftware.com.au/。它是免费的,我经常使用它。它适用于原型表达式。您需要重新安排基本工作的UI,但之后很容易。

(fyi)字符串之前的“@”表示\不再意味着特殊的东西,所以你可以输入@“c:\ fun.txt”而不是“c:\ fun.txt”

答案 1 :(得分:4)

让我知道我是否应该删除旧帖子,但也许有人想读它。

在正则表达式中执行“查找单词”的方法是这样的:

regex = @"(Key1|Key2|Key3|LastName|FirstName|Etc):"

你正在做的事情可能不值得在正则表达式中付出努力,尽管它可能可能以你想要的方式完成(但仍然没有100%明确要求)。它涉及展望下一场比赛,并在那时停下来。

这是一个重写,作为正则函数+常规功能代码应该可以解决问题。它不关心空格,所以如果你要求下面的“Key2”,它会将它与值分开。

string[] keys = {"Key1", "Key2", "Key3"};
string source = "Key1:Value1Key2: ValueAnd A: To Test Key3:   Something";
FindKeys(keys, source);

private void FindKeys(IEnumerable<string> keywords, string source) {
    var found = new Dictionary<string, string>(10);
    var keys = string.Join("|", keywords.ToArray());
    var matches = Regex.Matches(source, @"(?<key>" + keys + "):",
                          RegexOptions.IgnoreCase);            

    foreach (Match m in matches) {
        var key = m.Groups["key"].ToString();
        var start = m.Index + m.Length;
        var nx = m.NextMatch();
        var end = (nx.Success ? nx.Index : source.Length);
        found.Add(key, source.Substring(start, end - start));
    }

    foreach (var n in found) {
        Console.WriteLine("Key={0}, Value={1}", n.Key, n.Value);
    }                            
}

这个输出是:

Key=Key1, Value=Value1
Key=Key2, Value= ValueAnd A: To Test 
Key=Key3, Value=   Something

答案 2 :(得分:0)

/KeywordB\: (\w)/

这匹配关键字后面的任何字词。由于您没有提到任何终结符,我假设您只想要关键字旁边的单词。