Извлечение повторяющейся информации о группе из объекта java Matcher;Хотите ВСЕ значения внутри группы, а не только последние - PullRequest
0 голосов
/ 22 октября 2010

У меня проблемы с регулярным выражением ... дело в следующем: рассмотрите следующий HTML:

</p> <pre><form> <input name="methodIndex" value="0" type="hidden"> <hr align="left" width="80"> <h4>java.lang.String methodName()</h4> <p>Operation exposed for management</p> <table border="1" cellpadding="2" cellspacing="2"> <tbody> <tr class="OperationHeader"> <th>Param</th> <th>ParamType</th> <th>ParamValue</th> <th>ParamDescription</th> </tr> <tr> <td>p1</td> <td>java.lang.String</td> <td><input name="arg0" type="text"></td> <td>(no description)</td> </tr> <tr> <td>p2</td> <td>java.lang.String</td> <td><input name="arg0" type="text"></td> <td>(no description)</td> </tr> </tbody> </table> <input value="Invoke" type="submit"> </form> </pre> <p>

и теперь рассмотрим следующее регулярное выражение, которое форматирует этот html:

</p> <pre><input[^>]+name="methodIndex"[^>]*value="(.+?)"[^>]*> .+? <h4>\s+\s(.+?)\(\)</h4> \s+<p>[^<]+</p> \s* (?:<table[^>]+> \s* <tbody> \s* <tr[^>]*>(?:\s*<th>[^<]+</th>\s*){4}</tr> \s* (?:<tr>\s*<td>.+?</td>\s* \s*<td>\s*(.+?)\s*</td>\s* (?:\s*<td>.+?</td>\s*){2} </tr>\s*)+? \s* </tbody> \s* </table>)? .+? </form></pre> <p>

То, что я знаю, слишком сложно, но эй .. оно делает свою работу. Ну, вроде ... видите, он захватывает все, что я хочу захватить, но ... когда у меня есть несколько параметров (p1, p2, ..., pn), все параметры записываются, но размер группы сопоставителя остается 3 . а group (3) возвращает последний найденный параметр - pn. C # имеет функциональность CaptureGroup, но не Java .. как мне перехватить ВСЕ значения этой повторяющейся группы?

Это моя единственная проблема ... выяснить способ захвата ВСЕХ значений этой группы, а не только последних.

Большое спасибо за вашу помощь! Надеюсь, я ясно дал понять ...

1 Ответ

0 голосов
/ 22 октября 2010

Это соответствует всему, но группа захвата поймает только то, что в конце. Здесь вы можете использовать только регулярное выражение, чтобы съесть первую часть, затем создать другое, чтобы есть и сопоставлять параметры по одному, а затем повторно вызывать Matcher.find() для этой части ввода и извлекать параметр. Затем вы можете использовать другое регулярное выражение, чтобы съесть остальную часть ввода. Это будет ужасный беспорядок, поэтому вы должны использовать вместо этого генератор парсера или парсер XML.

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