2016-07-31 5 views
1

Я пытаюсь продвинуть свои знания java, пытаясь автоматизировать очистку веб-страницы и ввод формы. Я экспериментировал с jsoup и теперь htmlunit. Я нашел пример htmlunit, который я пытаюсь запустить.Выражение выражения в java htmlunit

public class GoogleHtmlUnitTest { 
    static final WebClient browser; 

    static { 
     browser = new WebClient(); 
     browser.getOptions().setJavaScriptEnabled(false); 
//  browser.setJavaScriptEnabled(false); 
    } 

    public static void main(String[] arguments) { 
     boolean result; 
     try { 
      result = searchTest(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      result = false; 
     } 

     System.out.println("Test " + (result? "passed." : "failed.")); 
     if (!result) { 
      System.exit(1); 
     } 
    } 

    private static boolean searchTest() { 
     HtmlPage currentPage; 

     try { 
      currentPage = (HtmlPage) browser.getPage("http://www.google.com"); 
     } catch (Exception e) { 
      System.out.println("Could not open browser window"); 
      e.printStackTrace(); 
      return false; 
     } 
     System.out.println("Simulated browser opened."); 

     try { 
      ((HtmlTextInput) currentPage.getElementByName("q")).setValueAttribute("qa automation"); 
      currentPage = currentPage.getElementByName("btnG").click(); 
      System.out.println("contents: " + currentPage.asText()); 
      return containsPattern(currentPage.asText(), "About .* results"); 
     } catch (Exception e) { 
      System.out.println("Could not search"); 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    public static boolean containsPattern(String string, String regex) { 
     Pattern pattern = Pattern.compile(regex); 

     // Check for the existence of the pattern 
     Matcher matcher = pattern.matcher(string); 
     return matcher.find(); 
    } 
} 

Он работает с некоторыми ошибками HtmlUnit, что я нашел на StackOverflow игнорировать. Программа работает правильно, поэтому я беру совет и игнорирую ошибки.

Jul 31, 2016 7:29:03 AM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error 
WARNING: CSS error: 'https://www.google.com/search?q=qa+automation&sa=G&gbv=1&sei=_eCdV63VGMjSmwHa85kg' [1:1467] Error in declaration. '*' is not allowed as first char of a property. 

В данный момент проблема заключается в выражении регулярного выражения, которое используется для поиска. Если я понимаю это правильно, «qa automation» просматривается в режиме googled, и поисковая страница просматривается по адресу:

return containsPattern (currentPage.asText(), «About. * Results»);

Что меня бросает, это «О. * Результаты». Это регулярное выражение, но я не понимаю, как его интерпретируют. Что искали на извлеченной странице?

ответ

0

.* означает «ноль или более любого символа», другими словами, полный шаблон. Это может быть

About 28 results 
About 2864 results 
About 2,864 results 
About ERROR results 
About results 

(Ответ на замечания.)

Честно говоря, вы должны найти быстрый регулярные выражения учебник. Вам не хватает некоторых очень простых вещей и вместо этого полагаться на свое собственное интуитивное понимание того, как «поиск» должен работать, что приводит к путанице.

Мне нравится преподавать, хотя, так что здесь немного больше :-)

Перейти к this RegExr link. Я уже поставил его с этим выражением:

/^About .* results$/gm 

Игнорируйте /^ и $/gm. (Если вы действительно хотите знать, две слэши - это обычная нотация для регулярных выражений. ^ и $ являются «якорями», которые заставляют «полный матч» - вот почему это казалось «О» должно было быть в позиции 0 Независимо от того, какой механизм регулярных выражений вы используете, он, кажется, заставляет якоря. g - это флаг, который просто означает «Выделить каждое совпадение», а m - это флаг, который означает «обрабатывать каждую строку как отдельную запись».) В любом случае , обратно к основному выражению:

About .* results 

И его матчи:

enter image description here

Посмотрите, как если вы поместите персонажа с обеих сторон, он больше не подходит? Опять же, это из-за привязки. Выражение ожидает «A» в качестве первого символа, поэтому «x» терпит неудачу. Выражение также ожидает, что последний символ будет «s», поэтому «x» тоже потерпит неудачу. Но почему About results потерпел неудачу? Это потому, что вокруг каждой стороны есть .*. Подстановочный знак .* не может ничего сопоставить, , но пробелы должны совпадать точно так же, как буквы и цифры. Таким образом, одно пространство не сократит его; вам нужно как минимум два.

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

[...], как бы я код регулярного выражения, чтобы найти «230» в любом положении, а затем «результаты», то есть «Foobar 230 foobar2 результатов»?

Другими словами, вы хотите, чтобы найти строку, которая начинается с чем-либо, имеет 230 где-то, есть больше ничего, пробел, «результаты», и ничего больше:

.*230.* results 

ли вам хотите точное число, 230?

.* 230 results 
+0

спасибо. Кажется, это работает. Он находит «около 5 230 000 результатов». Я сделал несколько экспериментов, и кажется, что «О» должно быть в позиции 1. Я изменил регулярное выражение на «230. * Results», но он его не нашел. Я попробовал ". * 230. * Results", и он не нашел. Как бы я нашел 230 в выше? –

+0

Ну, проблема с '230. * Results', это будет соответствовать фразам типа' 230 foobar results'. Вы пытаетесь найти «около 5,230,000 результатов», но используете 230 в вашем регулярном выражении? Для этого вы бы сделали что-то вроде '. *, 230,. *'. К сожалению, это также соответствует 6 230 000. Но я понятия не имею, что вы пытаетесь сделать. Помните, что пробелы имеют значение - они совпадают. –

+0

Я не пытаюсь ничего сделать, кроме как узнать, как работает регулярное выражение «About. * Results». Я вижу, что он нашел «около 6,230,000 результатов». Не понимая, как все это работает, я изменил regex на «230. * Results», ожидая, что он найдет тот же результат. Это не так. Это заставило меня поверить, что «О» должно быть на первом месте. Пробовал свои «. *, 230,. *», И он нашел то же самое. И последний вопрос. В приведенном выше «Около 6,230,000 результатов», как бы я закодировал regex, чтобы найти «230» в любой позиции, за которой следует «результат», т. Е. «Foobar 230 foobar2 results»? –

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

  • Нет связанных вопросов^_^