Как я могу найти строку после определенной строки / символа с помощью регулярных выражений - PullRequest
2 голосов
/ 18 января 2009

Я безнадежен с регулярным выражением (c #), поэтому я был бы признателен за некоторую помощь:

В основном мне нужно разобрать текст, и мне нужно найти следующую информацию внутри текста:

Пример текста:

Ключевое слово B: *** TextToFind * остальное не имеет значения, но ** Ключевое слово B: Текст ToFindB , а затем еще немного текста.

Мне нужно найти слово (слова) после определенного ключевого слова, которое может заканчиваться на «:».

[UPDATE]

Спасибо, Эндрю и Алан: Извините, что вновь открыл вопрос, но в этом регулярном выражении отсутствует достаточно важная вещь. Как я писал в своем последнем комментарии, можно ли иметь переменную (сколько слов искать в зависимости от ключевого слова) в составе регулярного выражения?

Или: у меня может быть другое регулярное выражение для каждого ключевого слова (будет заполнено только рукой). Но все еще не знаю, как задать постоянную «слова для поиска» внутри регулярного выражения

Ответы [ 3 ]

4 голосов
/ 18 января 2009

Основное регулярное выражение таково:

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/. Это бесплатно, и я использую его постоянно. Он прекрасно работает с выражениями-прототипами. Вам нужно изменить интерфейс для основной работы, но после этого это просто.

(fyi) «@» перед строками означает, что \ больше не означает что-то особенное, поэтому вместо «c: \ fun.txt» можно ввести @ «c: \ fun.txt»

4 голосов
/ 21 января 2009

Дайте мне знать, если я должен удалить старый пост, но, возможно, кто-то захочет его прочитать.

Способ сделать «слова для поиска» внутри регулярного выражения выглядит так:

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
0 голосов
/ 18 января 2009
/KeywordB\: (\w)/

Это соответствует любому слову, которое идет после вашего ключевого слова. Поскольку вы не упомянули терминатор, я предположил, что вам нужно только слово рядом с ключевым словом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...