2012-02-27 1 views
0

У меня есть простое выражение регулярного выражения ниже, чтобы вытащить значение внутри строки, которая окружена концом ** end, пример ниже. Однако, хотя это глупо просто, я пытаюсь получить результаты, которые мне нужны! Есть что-то очевидное, что я пропал! Большое спасибо, как всегда.Простой справочник по новостям для новобрачных

var str = "endhelloend"; 
var match = Regex.Match(str, @"end([a-z]+)end$", RegexOptions.IgnoreCase); 

if(match.Success) 
{ 
    result = match.Groups[0].Value // should return 'hello' 
} 
+0

Ваше регулярное выражение говорит, что только буквы могут быть между концом и концом. Это так?Можете ли вы предоставить примерные случаи, где это должно и не должно совпадать? – vcsjones

+0

Вы хотите извлечь текстовый контент из файлов HTML, чего вы хотите достичь? –

ответ

0

Использование раствор 1 извлечь .html содержание текста, а затем отфильтровать нужный текст из текста с помощью раствора 2.

  1. Чтобы очистить HTML элементы в .htm файл, попробуйте следующее:

    string CleanXml(string DirtyXml) 
    { 
        //string clean = ""; 
        int startloc = 0, endloc = 0; 
    
        for (int x = 0; x <= DirtyXml.Length-1; x++) 
        { 
         if (DirtyXml[x] == '<') 
         { 
          startloc = x; 
          x++; 
         } 
         if (DirtyXml[x] == '>') 
         { 
          endloc = x; 
          x++; 
          DirtyXml = DirtyXml.Remove(startloc, (endloc - startloc)+1); 
          x = 0; 
         } 
        } 
        return DirtyXml; 
    } 
    
  2. Regex для фильтрации текста "endhelloend" получить "привет" enter image description here

    string result = ""; 
        var str = "endhelloend"; 
        var match = Regex.Match(str, @"end([a-z]+)end$", RegexOptions.IgnoreCase); 
        if(match.Success) 
        { 
         result = match.Groups[1].Value; // Returns 'hello' 
        } 
        Console.WriteLine(result); 
        Console.ReadLine(); 
    
+0

, который работает для меня, хотя он не работает при использовании этого –

+0

var str = System.IO.File.ReadAllText (@ "test.htm"); var match = Regex.Match (str, @ "end ([a-z] +) end $", RegexOptions.IgnoreCase); if (match.Success) { var result = match.Groups [1] .Value; // возвращает 'привет' } –

+0

содержание ул является " Здравствуйте endhelloend

Это пример

" –

3

match.Groups [0] будет соответствовать всему регулярному выражению - посмотрите на match.Groups [1].

+0

спасибо, но в то время как отладка matchin.Success оценивается как false, поэтому match.group никогда не попадает с приведенным примером. –

+0

Вы должны поместить эту информацию в вопрос. Попробуйте [a-z] +? как ваша соответствующая группа, посмотрите, поможет ли это. + Является жадным оператором по умолчанию iirc, поэтому он может быть совпадающим концом, поэтому не находит закрывающую строку. –

+0

Создание '+' не-жадного не должно иметь никакого эффекта. Это правда, что жадный '[a-z] +' will * изначально * потребляет второй «конец», но затем он отступит достаточно далеко, чтобы остальное регулярное выражение ('end $') соответствовало тому, что ему нужно. –

4

Ваш шаблон правильно содержит группу, которую вы хотите извлечь. Соответствие регулярного выражения будет содержать набор групп для доступа. В вашем примере, попробуйте следующее:

var str = "endhelloend"; 
var match = Regex.Match(str, @"end([a-z]+)end$", RegexOptions.IgnoreCase); 

if(match.Success) 
{ 
    var hello = match.Groups[1]; 
} 

match.Groups [0] вернет весь матч «endhelloend», так что вы просто хотите, 1-й группы в течение матча.

1

Я думаю, что эта строка должна выглядеть так: result = match.Groups[1].Value;

0

Попробуйте, это даст вам любой алфавитный символ, который между словом конца, но не захватит фактическое слово конца

(?<=end)[a-z]+?(?=end) 
+0

Lookarounds добавляют ненужную сложность, не принося никакой пользы. Ваше регулярное выражение будет работать, но это потому, что вы оставили '$' off (как объяснил @sln), а не из-за поисковых запросов. –

+0

@Alan Moore, я фактически упустил ** $ ** (un) намеренно: D, вопрос использовал строку * endhelloend * в качестве теста, а не * endhelloend 123 455 ... * Какую сложность представлял бы поиск ? Я не думал, что его удар производительности будет таким большим, и imho это будет красивее 'match.Value' – Jason

1

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

Это регулярное выражение end([a-z]+)end$ будет соответствовать этой строке «endhelloend».
Внутренний текст будет находиться в группе захвата 1.
Это не будет соответствовать той же самой строке, когда ее подстроки, как этот
«endhelloend of the world».

Причина в том, у вас есть конец строки metachar (утверждение) $ как часть регулярного выражения
только после того, как «конец».

Итак, вы можете просто вынуть $ в регулярное выражение, и оно должно работать нормально.
Следует учитывать и другие вещи. Я прокомментирую это в регулярном выражении.

end  // find a literal 'end' 
(   // Capture group 1 open 
    [a-z]+ // Find as many characters a-z as possible (including 'e' 'n' 'd' ins sequence 
)   // Capture group 1 close 
end  // find a literal 'end' 
$   // End of string assertion (the last 'end' must be the last word in the string) 
Смежные вопросы