Помощь с регулярным выражением Java - PullRequest
3 голосов
/ 04 июня 2011

Эй, я боролся с этим регулярным выражением, и у меня нет идей. У меня есть эти типы строк (не все из них здесь, но только эти 2 типа), и я должен извлечь часть между тегами th .

<th class="tip" title='manje'>manje</th>
<th class="tip" title='ne d.'>ne d.</th>
<th class="tip" title='manje'>manje</th>
<th class="tip" title='točno'>točno</th>
<th class="tip" title='više'>više</th>
<th class="tip" title='m./t.'>m./t.</th>
<th class="tip" title='v./t.'>v./t.</th>
<th class="tip">daje</th>
<th class="tip">X2</th>
<th class="tip">12</th>

Я пробовал некоторые комбинации, но я получаю значение, только если в теге th нет этого атрибута "title".

Этот шаблон извлекает содержимое, только если в теге th нет атрибута "title":

Pattern pattern = Pattern.compile("<th class=\"tip\"[\\s*|[.]{0,20}]>(.*?)\\s*</th>");

Этот также:

Pattern patternType = Pattern.compile("<th class=\"tip\"[\\s*|[.]{0,20}]>(.*?)\\s*</th>");

Есть предложения? Tnx

Ответы [ 5 ]

5 голосов
/ 04 июня 2011

Регулярные выражения подходят не во всех случаях. Вместо этого используйте Jsoup:

package so6235727;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class PrintContent {

  private static final String html = //
      "<th class=\"tip\" title='manje'>manje</th>\r\n" + //
      "<th class=\"tip\" title='ne d.'>ne d.</th>\r\n" + //
      "<th class=\"tip\" title='manje'>manje</th>\r\n" + //
      "<th class=\"tip\" title='točno'>točno</th>\r\n" + //
      "<th class=\"tip\" title='više'>više</th>\r\n" + //
      "<th class=\"tip\" title='m./t.'>m./t.</th>\r\n" + //
      "<th class=\"tip\" title='v./t.'>v./t.</th>\r\n" + //
      "<th class=\"tip\">daje</th>\r\n" + //
      "<th class=\"tip\">X2</th>\r\n" + //
      "<th class=\"tip\">12</th>\r\n";

  public static void main(String[] args) {
    Document jsoup = Jsoup.parse(html);
    Elements headings = jsoup.select("th.tip");
    for (Element element : headings) {
      System.out.println(element.text());
    }
  }
}

Видишь, как это просто?

0 голосов
/ 04 июня 2011

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

 import java.util.regex.Matcher;
 import java.util.regex.Pattern;

public class Regex {

public static void test(String patternString) {
    System.out.println("Test with pattern: " + patternString);
    Pattern pattern = Pattern.compile(patternString);
    String[] testStrings = {"<th class=\"tip\" title='manje'>manje</th>", "<th class=\"tip\">daje</th>"};
    for (String testString : testStrings) {
        System.out.println("> Test on " + testString);
        Matcher matcher = pattern.matcher(testString);
        if (matcher.matches()) {
            System.out.println(">> number of matches in group = " + matcher.groupCount());
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println(">>group " + i + " is " + matcher.group(i));
            }
        } else {
            System.out.println(">> no match");
        }
    }
    System.out.println("");
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    test("<th class=\"tip\"[\\s*|[.]{0,20}]>(.*?)\\s*</th>"); // op
    test("<th[^>]*>(.*?)\\s*</th>"); // Billy Moon
    test("<th class=\"tip\"[^>]*>(.*)</th>"); // stuken.yuri
    test("(?<=<th .{0,100}>).*(?=</th>)"); // Hovercraft full of Eels
    test("(?:<th .{0,100}>).*(?:</th>)");
}
}

Мой вывод состоит в том, что я получаю совпадение для Билли Мун и stuken.yuri, но не для OP или Hovercraft.Мне было бы интересно посмотреть, получат ли другие то же самое.Я использую бета-версию Java 7 с Windows 7.

0 голосов
/ 04 июня 2011

Попробуйте это:

Pattern pattern = Pattern.compile("<th class=\"tip\"[^>]*>(.*)</th>");
0 голосов
/ 04 июня 2011

Какого черта, еще одна попытка ответа по шаблону, эта с заглядыванием вперед и оглядываясь назад:

Pattern pattern = Pattern.compile("(?<=<th .{0,100}>).*(?=</th>)");

РЕДАКТИРОВАТЬ 1
Относительно I tried it and it doesn't work in any case: возможно, ваша подвеска отличается от моей:

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Foo1 {
   private static final String FOO_TXT = "Foo1.txt";

   public static void main(String[] args) {
      Pattern pattern = Pattern.compile("(?<=<th .{0,100}>).*(?=</th>)");

      Scanner scan = new Scanner(Foo1.class.getResourceAsStream(FOO_TXT));
      while (scan.hasNextLine()) {
         String line = scan.nextLine();
         System.out.println("Line: " + line);
         Matcher match = pattern.matcher(line);
         if (match.find()) {
            System.out.println("Match: " + match.group());
         } else {
            System.out.println("No match found");
         }
      }
   }
}

Предполагается, что текстовый файл называется Foo1.txt и находится в файлах классов.

0 голосов
/ 04 июня 2011

Попробуйте это:

Pattern pattern = Pattern.compile("<th[^>]*>(.*?)\\s*</th>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...