2014-09-07 3 views
-1

Я знаю, что были варианты вопросов ответили здесьJava не Regex подбирая несколько вхождений строки

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

<a name='bill_pay' href='javascript:goto(&#39;billpay&#39;);' class='fsdnav-top-menu-item'>Bill Pay <span class='fsdnav-ada-hidden'>link and menu. Press enter to navigate to this link. Press control + space to open submenu. 

To move through submenu items press tab and then press up or down arrow.</span> </a> 
<a name='bill_pay' href='javascript:goto(&#39;findmyinfo&#39;);' class='fsdnav-top-menu-item'> 
Bill Pay <span class='fsdnav-ada-hidden'>link and menu. Press enter to navigate to this link. Press control + space to open submenu. 

To move through submenu items press tab and then press up or down arrow.</span> </a> 
<a name='bill_pay' href='#' onClick='OOLPopUp(&#39;/myaccounts/brain/redirect.go?target=findmyroutingnumber&#39;,&#39;ool&#39;,&#39;currentPage&#39;);return false;' class='fsdnav-top-menu-item'> 
Bill Pay <span class='fsdnav-ada-hidden'>link and menu. Press enter to navigate to this link. Press control + space to open submenu. 
To move through submenu items press tab and then press up or down arrow.</span> </a> 

Я хотел бы, чтобы извлечь следующее содержимое из javascript:goto(&quot;link&quot;) (то, что когда-либо связать значение представляет) Есть несколько таких явлений в приведенном выше регулярном выражении, но регулярное выражение, которое я использую возвращаю только один случай. Я хотел бы вернуть все это. Мой блок кода приведен ниже

private static final Pattern PATTERN_WITH_ASCII_QUOTES = 
    Pattern.compile("^.*goto\\(&#39;(\\w+)&#39;\\).*", 
     Pattern.MULTILINE|Pattern.DOTALL); 

// "str" is the string representation of the text above. 
Matcher m = PATTERN_WITH_ASCII_QUOTES.matcher(str); 
while (m.find()) { 
    System.out.println(m.group(1)); 
} 

Полученный выход всегда findmyinfo и больше ничего.

UPDATE - Нужные выходы

billpay (from javascript:goto(&#39;billpay&#39;);) 
findmyinfo (from javascript:goto(&#39;findmyinfo&#39;);) 

Я также хотел бы, чтобы извлечь

/myaccounts/brain/redirect.go?target=findmyroutingnumber&#39;,&#39;ool&#39;,&#39;currentPage from OOLPopUp(&#39;/myaccounts/brain/redirect.go?target=findmyroutingnumber&#39;,&#39;ool&#39;,&#39;currentPage&#39;) 
+2

Что ваш ожидаемый результат? –

ответ

1

Вам нужно добавить OLLPopUp и goto в не - захват группы в порядке, чтобы получить первое, второе и третье значения.

^.*?(?:goto|OOLPopUp)\(&#39;(.*?)&#39;\).* 

DEMO

String s = "<a name='bill_pay' href='javascript:goto(&#39;billpay&#39;);' class='fsdnav-top-menu-item'>Bill Pay <span class='fsdnav-ada-hidden'>link and menu. Press enter to navigate to this link. Press control + space to open submenu.\n" + 
     "To move through submenu items press tab and then press up or down arrow.</span> </a>\n" + 
     "<a name='bill_pay' href='javascript:goto(&#39;findmyinfo&#39;);' class='fsdnav-top-menu-item'>\n" + 
     "<a name='bill_pay' href='#' onClick='OOLPopUp(&#39;/myaccounts/brain/redirect.go?target=findmyroutingnumber&#39;,&#39;ool&#39;,&#39;currentPage&#39;);return false;' class='fsdnav-top-menu-item'>\n" + 
     "Bill Pay <span class='fsdnav-ada-hidden'>link and menu. Press enter to navigate to this link. Press control + space to open submenu."; 
Pattern regex = Pattern.compile("^.*?(?:goto|OOLPopUp)\\(&#39;(.*?)&#39;\\).*", Pattern.MULTILINE); 
Matcher matcher = regex.matcher(s); 
while(matcher.find()){ 
     System.out.println(matcher.group(1)); 
} 

Выход:

billpay 
findmyinfo 
/myaccounts/brain/redirect.go?target=findmyroutingnumber&#39;,&#39;ool&#39;,&#39;currentPage 

ИЛИ

String s = "<a name='bill_pay' href='javascript:goto(&#39;billpay&#39;);' class='fsdnav-top-menu-item'>Bill Pay <span class='fsdnav-ada-hidden'>link and menu. Press enter to navigate to this link. Press control + space to open submenu.\n" + 
     "To move through submenu items press tab and then press up or down arrow.</span> </a>\n" + 
     "<a name='bill_pay' href='javascript:goto(&#39;findmyinfo&#39;);' class='fsdnav-top-menu-item'>\n" + 
     "<a name='bill_pay' href='#' onClick='OOLPopUp(&#39;/myaccounts/brain/redirect.go?target=findmyroutingnumber&#39;,&#39;ool&#39;,&#39;currentPage&#39;);return false;' class='fsdnav-top-menu-item'>\n" + 
     "Bill Pay <span class='fsdnav-ada-hidden'>link and menu. Press enter to navigate to this link. Press control + space to open submenu."; 
Pattern regex = Pattern.compile("^(?:.*?goto\\(&#39;(\\w+)&#39;\\).*|.*?OOLPopUp\\(&#39;(.+?&#39;\\)).*)$", Pattern.MULTILINE); 
Matcher matcher = regex.matcher(s); 
while(matcher.find()){ 
     System.out.println(matcher.group(1) != null ? 
       matcher.group(1) : matcher.group(2) 
       ); 
} 

Выход:

billpay 
findmyinfo 
/myaccounts/brain/redirect.go?target=findmyroutingnumber&#39;,&#39;ool&#39;,&#39;currentPage&#39;) 

IDEONE

+0

У меня есть другое разъяснение, и я надеюсь, что вы не возражаете. У меня есть еще один набор URL-адресов, например Bill Pay, заменив ' на \ '. Я попытался перестроить ваше регулярное выражение, но, похоже, ничего не работает. Я получаю IndexOutOfBoundsException для каждого варианта, который я пытаюсь. Как я могу это добавить? – Kartik

+0

@Kartik вы имеете в виду это http://regex101.com/r/lJ4lF9/4? –

+0

Да. Это именно тот эффект, который я хочу. Хотя мы используем одинарные кавычки в нашем HTML-документе, поэтому у нас есть набор, например Bill Pay. Я также хотел бы получить отсюда значение. – Kartik

1

Вы всегда принимает группу (1), которая является probem. Использование

while (m.find()) { 
    System.out.println(m.group()); 
} 
+0

Текст не печатается. Первая запись - целая строка, а затем ничего. Я не получаю извлеченные строки. – Kartik

0

У вас возникла проблема с вашим рисунком. Попробуйте это:

Pattern.compile("goto\\(&#39;(\\w+)&#39;\\)", 
        Pattern.MULTILINE|Pattern.DOTALL); 

Кроме того, в печати результата, вы можете попробовать:

System.out.println(m.group(1) + " (from " + str.substring(m.toMatchResult().start(), m.toMatchResult().end()) + ")"); 

значение выходной, как это:

billpay (from goto(&#39;billpay&#39;);) 
findmyinfo (from goto(&#39;findmyinfo&#39;);) 
Смежные вопросы