2013-10-25 3 views
1

Нужна помощь. Почему я получаю ArgumentException, был Unhandle. ошибка показывает Unrecognized grouping construct. Является ли мой шаблон неправильным?Ошибка C# Непризнанная конструкция группировки

WebClient client = new WebClient(); 
      string contents = client.DownloadString("http://site.com"); 

       string pattern [email protected]"<td>\s*(?<no>\d+)\.\s*</td>\s*<td>\s* 
         <a class=""LN"" href=""[^""]*+"" 
         onclick=""[^""]*+"">\s*+<b>(?<name>[^<]*+) 
         </b>\s*+</a>.*\s*</td>\s*+ 
         <td align=""center"">[^<]*+</td> 
         \s*+<td>\s*+(?<locations>(?:<a href=""[^""]*+"">[^<]*+</a><br />\s*+)++)</td>"; 

      foreach (Match match in Regex.Matches(contents, pattern, RegexOptions.IgnoreCase)) 
      { 
       string no = match.Groups["no"].Value; 
       string name = match.Groups["name"].Value; 
       string locations = match.Groups["locations"].Value; 

       Console.WriteLine(no+" "+name+" "+locations); 
      } 
+1

Удовлетворяющий факт: Используя строковые литералы, вы можете развернуть строку по нескольким строкам. Вам не нужно поддерживать конкатенирование строк в каждой строке. –

+0

regex не используется для разбора html..Используйте html-парсер, например htmlagilitypack! Есть 1000 случаев для этого кода, чтобы разбить .. Пожалуйста, не используйте regex – Anirudha

+1

Обязательная [ссылка] (http://stackoverflow.com/ вопросы/1732348/regex-match-open-tags-except-xhtml-self-contains-tags/1732454 # 1732454) против парсинга html с регулярным выражением –

ответ

1

В C# /. NET нет такой вещи, как ?P<name>. Эквивалентный синтаксис равен ?<name>.

P Именованный групповой синтаксис от PCRE/Python (и Perl допускает его как расширение).

Вам также необходимо удалить все вложенные кванторов (т.е. изменить *+ к * и ++ к +). Если вы хотите получить то же самое поведение, вы можете переключить X*+ на (?>X*), а также с ++.

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

new Regex(
@"<td>     # a td element 
    \s*(?<no>\d+)\.\s* # containing a number captured as 'no' 
    </td>\s* 
    <td>\s*    # followed by another td, containing 
         # an <a href=... onclick=...> exactly 
     <a class=""LN"" href=""(?>[^""]*)"" onclick=""(?>[^""]*)""> 
     (?>\s*)     # which contains 
     <b>(?<name>(?>[^<]*))</b> # some text in bold captured as 'name' 
     (?>\s*) 
     </a> 
     .*     # and anywhere later in the document 
     \s* 
    </td>     # the end of a td, followed by whitespace 
    (?>\s*) 
    <td align=""center""> # after a <td align=center> containing no other elements 
    (?>[^<]*) 
    </td> 
    (?>\s*) 
    <td>     # lastly 
    (?>\s*) 
    (?<locations>  # a series of <a href=...>...</a><br/> 
     (?>(?:   # captured as 'locations' 
      <a href=""(?>[^""]*)"">(?>[^<]*)</a> 
      <br /> 
      (?>\s*) 
      ) 
     +))    # (containing at least one of these) 
    </td>", RegexOptions.IgnorePatternWhitespace|RegexOptions.IgnoreCase) 

Но вы действительно должны использовать что-то вроде HTML Agility Pack.

+0

спасибо @Porges,.:) ... ошибка исчезла, но я не получаю результат. Я думаю, что проблема теперь в моем регулярном выражении, как то, что сказал MarkHall. – Cindy93

Смежные вопросы