1

I like to extract text from html page using regular expressions. Here is my code:

String regExp="<h3 class=\"field-content\"><a[^>]*>(\\w+)</a></h3>";
    Pattern regExpMatcher=Pattern.compile(regExp,Pattern.UNICODE_CHARACTER_CLASS);

    String example="<h3 class=\"field-content\"><a href=\"/humana-akcija-na-kavadarechkite-navivachi-lozari\">Проба 1</a></h3><h3 class=\"field-content\"><a href=\"/opshtina-berovo-ne-mozhe-da-sostavi-sovet-0\">Проба 2</a></h3>";
    Matcher m=regExpMatcher.matcher(example);
    while(m.find())
    {

        System.out.println(m.group(1));
    }

I like to get the values Проба 1 and Проба 2. However I only get the first value Проба 1. What is my problem?

Ro Yo Mi
  • 14,790
  • 5
  • 35
  • 43
vikifor
  • 3,426
  • 4
  • 45
  • 75
  • 6
    Don't use regex for this. Use a HTML parser like [JSoup](http://jsoup.org/) – Luiggi Mendoza Jun 09 '13 at 21:07
  • It is for my school project and I have to use regular expressions... – vikifor Jun 09 '13 at 21:08
  • Do not use regular expressions for parsing html: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – Micha Wiedenmann Jun 09 '13 at 21:11
  • If you can't use JSoup (or a real HTML parser) for this and you know there always be `

    ` handle it using String plain operations, not RegEx.
    – Luiggi Mendoza Jun 09 '13 at 21:11
  • 1
    @MichaWiedenmann from the link: *Even [Jon Skeet](http://stackoverflow.com/users/22656/jon-skeet) cannot parse HTML using regular expressions.* this sentence made my day :). – Luiggi Mendoza Jun 09 '13 at 21:12
  • 1
    @vikifor "I have to use regular expressions..." <-- no, you have to change teachers – fge Jun 09 '13 at 21:23

2 Answers2

5

It is blasphemy to use regex + HTML. But if you really want to be cursed then here it is (you have been warned):


String regExp = "<h3 class=\"field-content\"><a[^>]*>([\\w\\s]+)</a></h3>";
                                                       ^updated part

Since Проба 1 and Проба 2 contains also spaces you need to include \\s to your pattern.

Pshemo
  • 122,468
  • 25
  • 185
  • 269
1

To discover the power of the dark side, you can try this pattern:

<h3 class=\"field-content\"><a[^>]*>([^<]+)</a></h3>

Don't forget to set the UNICODE_CASE before.

Casimir et Hippolyte
  • 88,009
  • 5
  • 94
  • 125