title: Html Parsing with regex over multiple lines
body: <p>Currently I'm writing a program in Java, where I have to parse a html file and get all the names from the tables. I have to write it in pure Java, so I can't use Jsoup or something similar.</p>
  
  <p>a snippet of the html is here: </p>
  
  <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
  <div class="snippet-code">
  <pre class="snippet-code-html lang-html prettyprint-override"><code>&lt;table class="wikitable toptextcells" width="100%"&gt;
  &lt;tbody&gt;&lt;tr&gt;
  &lt;th width="50%"&gt;Comic
  &lt;/th&gt;
  &lt;th width="50%"&gt;Film
  &lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td colspan="2" class="hintergrundfarbe2"&gt;
  &lt;h3&gt;&lt;span id="0.E2.80.939"&gt;&lt;/span&gt;&lt;span class="mw-headline" id="0–9"&gt;&lt;span id="Real-0–9"&gt;&lt;/span&gt; 0–9&lt;/span&gt;&lt;span class="mw-editsection"&gt;&lt;span class="mw-editsection-bracket"&gt;[&lt;/span&gt;&lt;a href="https://de.wikipedia.org/w/index.php?title=Liste_von_Comicverfilmungen&amp;amp;veaction=edit&amp;amp;section=2" class="mw-editsection-visualeditor" title="Abschnitt bearbeiten: 0–9"&gt;Bearbeiten&lt;/a&gt;&lt;span class="mw-editsection-divider"&gt; | &lt;/span&gt;&lt;a href="https://de.wikipedia.org/w/index.php?title=Liste_von_Comicverfilmungen&amp;amp;action=edit&amp;amp;section=2" title="Abschnitt bearbeiten: 0–9"&gt;Quelltext bearbeiten&lt;/a&gt;&lt;span class="mw-editsection-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;2 Guns
  &lt;/td&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/2_Guns" title="2 Guns"&gt;2 Guns&lt;/a&gt; (2013)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;5 ist die perfekte Zahl (von &lt;a href="https://de.wikipedia.org/wiki/Igort" title="Igort"&gt;Igort&lt;/a&gt;)
  &lt;/td&gt;
  &lt;td&gt;5 è il numero perfetto (2019)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;13 rue de l'Espoir (von &lt;a href="https://de.wikipedia.org/wiki/Paul_Gillon" title="Paul Gillon"&gt;Paul Gillon&lt;/a&gt;)
  &lt;/td&gt;
  &lt;td&gt;Die tolle Masche (1961)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td rowspan="2"&gt;&lt;a href="https://de.wikipedia.org/wiki/XIII_(Comicserie)" title="XIII (Comicserie)"&gt;XIII&lt;/a&gt;
  &lt;/td&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/XIII_%E2%80%93_Die_Verschw%C3%B6rung" title="XIII – Die Verschwörung"&gt;XIII – Die Verschwörung&lt;/a&gt; (Fernseh-Zweiteiler, 2008)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/XIII_%E2%80%93_Die_Verschw%C3%B6rung_(Fernsehserie)" title="XIII – Die Verschwörung (Fernsehserie)"&gt;XIII – Die Verschwörung&lt;/a&gt; (Fernsehserie, 2011–2012)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td rowspan="3"&gt;&lt;a href="https://de.wikipedia.org/wiki/20th_Century_Boys" title="20th Century Boys"&gt;20th Century Boys&lt;/a&gt;
  &lt;/td&gt;
  &lt;td&gt;20th Century Boys 1 (2008)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;20th Century Boys 2 (2009)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;20th Century Boys 3 (2009)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td rowspan="2"&gt;30 Days of Night
  &lt;/td&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/30_Days_of_Night" title="30 Days of Night"&gt;30 Days of Night&lt;/a&gt; (2007)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/30_Days_of_Night:_Dark_Days" title="30 Days of Night: Dark Days"&gt;30 Days of Night: Dark Days&lt;/a&gt; (2010)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td rowspan="2"&gt;47:an Löken (von Lennart Elworth)
  &lt;/td&gt;
  &lt;td&gt;47:an Löken (1971)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;47:an Löken blåser på (1972)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td rowspan="8"&gt;91:an Karlsson (von &lt;a href="https://de.wikipedia.org/wiki/Rudolf_Petersson" title="Rudolf Petersson"&gt;Rudolf Petersson&lt;/a&gt;)
  &lt;/td&gt;
  &lt;td&gt;Aber warum, Herr Feldwebel? (1946)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Zurück, marsch-marsch! (1947)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Rekruten rechts 'raus (1951)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Alla tiders 91:an Karlsson (1953)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;91 Karlsson rycker in (1955)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;91:an Karlsson slår knock out (1957)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;91:an Karlsson muckar (tror han) (1959)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;91:an och generalernas fnatt (1977)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td rowspan="2"&gt;&lt;a href="https://de.wikipedia.org/wiki/300_(Comic)" title="300 (Comic)"&gt;300&lt;/a&gt;
  &lt;/td&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/300_(Film)" title="300 (Film)"&gt;300&lt;/a&gt; (2007)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/300:_Rise_of_an_Empire" title="300: Rise of an Empire"&gt;300: Rise of an Empire&lt;/a&gt; (2014)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td colspan="2" class="hintergrundfarbe2"&gt;
  &lt;h3&gt;&lt;span class="mw-headline" id="A"&gt;&lt;span id="Real-A"&gt;&lt;/span&gt; A&lt;/span&gt;&lt;span class="mw-editsection"&gt;&lt;span class="mw-editsection-bracket"&gt;[&lt;/span&gt;&lt;a href="https://de.wikipedia.org/w/index.php?title=Liste_von_Comicverfilmungen&amp;amp;veaction=edit&amp;amp;section=3" class="mw-editsection-visualeditor" title="Abschnitt bearbeiten: A"&gt;Bearbeiten&lt;/a&gt;&lt;span class="mw-editsection-divider"&gt; | &lt;/span&gt;&lt;a href="https://de.wikipedia.org/w/index.php?title=Liste_von_Comicverfilmungen&amp;amp;action=edit&amp;amp;section=3" title="Abschnitt bearbeiten: A"&gt;Quelltext bearbeiten&lt;/a&gt;&lt;span class="mw-editsection-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Abattoir (Radical Studios)
  &lt;/td&gt;
  &lt;td&gt;Abattoir – Er erwartet dich! (2016)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Ace Drummond (von &lt;a href="https://de.wikipedia.org/wiki/Edward_Vernon_Rickenbacker" title="Edward Vernon Rickenbacker"&gt;Eddie Rickenbacker&lt;/a&gt; und Clayton Knight)
  &lt;/td&gt;
  &lt;td&gt;Ace Drummond (Serial, 1936)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Accident Man (von Pat Mills u.&amp;nbsp;a.)
  &lt;/td&gt;
  &lt;td&gt;Accident Man (2018)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Ada im Dschungel (von &lt;a href="https://de.wikipedia.org/wiki/Francesco_Tullio_Altan" title="Francesco Tullio Altan"&gt;Altan&lt;/a&gt;)
  &lt;/td&gt;
  &lt;td&gt;Ada dans la jungle (1988)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td rowspan="6"&gt;&lt;a href="https://de.wikipedia.org/wiki/The_Addams_Family" title="The Addams Family"&gt;The Addams Family&lt;/a&gt; (Zeitungscartoons)
  &lt;/td&gt;
  &lt;td&gt;Die Addams Family (Fernsehserie, 1964–1966)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Halloween with the New Addams Family (1977)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Addams_Family_(1991)" title="Addams Family (1991)"&gt;Addams Family&lt;/a&gt; (1991)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Die_Addams_Family_in_verr%C3%BCckter_Tradition" title="Die Addams Family in verrückter Tradition"&gt;Die Addams Family in verrückter Tradition&lt;/a&gt; (1993)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Addams_Family_%E2%80%93_Und_die_lieben_Verwandten" title="Addams Family – Und die lieben Verwandten"&gt;Addams Family – Und die lieben Verwandten&lt;/a&gt; (1998)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Die_neue_Addams_Familie" title="Die neue Addams Familie"&gt;Die neue Addams Familie&lt;/a&gt; (Fernsehserie, 1998–1999)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Adeles_ungew%C3%B6hnliche_Abenteuer" title="Adeles ungewöhnliche Abenteuer"&gt;Adeles ungewöhnliche Abenteuer&lt;/a&gt;
  &lt;/td&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Ad%C3%A8le_und_das_Geheimnis_des_Pharaos" title="Adèle und das Geheimnis des Pharaos"&gt;Adèle und das Geheimnis des Pharaos&lt;/a&gt; (2010)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Figuren_aus_dem_Marvel-Universum#Margaret_%E2%80%9EPeggy%E2%80%9C_Carter" title="Figuren aus dem Marvel-Universum"&gt;Agent Carter&lt;/a&gt;
  &lt;/td&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Marvel%E2%80%99s_Agent_Carter" title="Marvel’s Agent Carter"&gt;Marvel’s Agent Carter&lt;/a&gt; (Fernsehserie, 2015–2016)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Air Hawk (von John Dixon)
  &lt;/td&gt;
  &lt;td&gt;Air Hawk (1981)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Alena (von Kim W. Andersson)
  &lt;/td&gt;
  &lt;td&gt;Alena (2015)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Alexander_Nikopol" title="Alexander Nikopol"&gt;Alexander Nikopol&lt;/a&gt; (&lt;i&gt;Die Geschäfte der Unsterblichen&lt;/i&gt;)
  &lt;/td&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Immortal_%E2%80%93_New_York_2095:_Die_R%C3%BCckkehr_der_G%C3%B6tter" title="Immortal – New York 2095: Die Rückkehr der Götter"&gt;Immortal – New York 2095: Die Rückkehr der Götter&lt;/a&gt; (2004)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Allein_(Comic)" title="Allein (Comic)"&gt;Allein&lt;/a&gt;
  &lt;/td&gt;
  &lt;td&gt;Seuls (2017)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Der_allt%C3%A4gliche_Kampf" title="Der alltägliche Kampf"&gt;Der alltägliche Kampf&lt;/a&gt; (von &lt;a href="https://de.wikipedia.org/wiki/Manu_Larcenet" title="Manu Larcenet"&gt;Manu Larcenet&lt;/a&gt;)
  &lt;/td&gt;
  &lt;td&gt;Le Combat ordinaire (2015)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td rowspan="3"&gt;Ally Sloper (von Marie Duval und C. H. Ross)
  &lt;/td&gt;
  &lt;td&gt;Ally Sloper (Kurzfilm, 1898)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Sloper's Visit to Brighton (Kurzfilm, 1898)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Ally Sloper (Kurzfilm-Serie, 1921)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td rowspan="2"&gt;&lt;a href="https://de.wikipedia.org/w/index.php?title=Along_with_the_Gods_(Webtoon)&amp;amp;action=edit&amp;amp;redlink=1" class="new" title="Along with the Gods (Webtoon) (Seite nicht vorhanden)"&gt;Along with the Gods&lt;/a&gt;
  &lt;/td&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Along_with_the_Gods:_The_Two_Worlds" title="Along with the Gods: The Two Worlds"&gt;Along with the Gods: The Two Worlds&lt;/a&gt; (2017)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;a href="https://de.wikipedia.org/wiki/Along_with_the_Gods:_The_Last_49_Days" title="Along with the Gods: The Last 49 Days"&gt;Along with the Gods: The Last 49 Days&lt;/a&gt; (2018)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt;Alphonse and Gaston (von &lt;a href="https://de.wikipedia.org/wiki/Frederick_Burr_Opper" title="Frederick Burr Opper"&gt;Frederick Burr Opper&lt;/a&gt;)
  &lt;/td&gt;
  &lt;td&gt;Alphonse and Gaston (Kurzfilm-Serie, 1902–1903)
  &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
  &lt;h2&gt;&lt;span class="mw-headline" id="Anmerkung_zu_Trickfilmen_und_Comiczeichnern"&gt;Anmerkung zu Trickfilmen und Comiczeichnern&lt;/span&gt;&lt;span class="mw-editsection"&gt;&lt;span class="mw-editsection-bracket"&gt;[&lt;/span&gt;&lt;a href="https://de.wikipedia.org/w/index.php?title=Liste_von_Comicverfilmungen&amp;amp;veaction=edit&amp;amp;section=57" class="mw-editsection-visualeditor" title="Abschnitt bearbeiten: Anmerkung zu Trickfilmen und Comiczeichnern"&gt;Bearbeiten&lt;/a&gt;&lt;span class="mw-editsection-divider"&gt; | &lt;/span&gt;&lt;a href="https://de.wikipedia.org/w/index.php?title=Liste_von_Comicverfilmungen&amp;amp;action=edit&amp;amp;section=57" title="Abschnitt bearbeiten: Anmerkung zu Trickfilmen und Comiczeichnern"&gt;Quelltext bearbeiten&lt;/a&gt;&lt;span class="mw-editsection-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;</code></pre>
  </div>
  </div>
  </p>
  
  <p>At first I wanted to match only the <code>&lt;tr&gt;</code> which have two <code>&lt;td&gt;</code> in them but I can't figure out why it isn't working.
  I checked my regex on www.regex101.com and it seems to be fine. But in Java I had to replace the \n with .*? to even get a match. 
  This i my Java Code:</p>
  
  <pre><code>import utils.YearInterval;
  
  import java.io.IOException;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.nio.file.Path;
  import java.nio.file.Paths;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  import java.util.Scanner;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  public class Parser {
      private Pattern comicBegin = Pattern.compile("&lt;h3&gt;&lt;span id=\"0\\.E2\\.80\\.939\"&gt;&lt;/span&gt;.*?&lt;/h3&gt;", Pattern.MULTILINE | Pattern.DOTALL);
      private Pattern comicEnd = Pattern.compile("&lt;h2&gt;&lt;span class=\"mw-headline\" id=\"Anmerkung_zu_Trickfilmen_und_Comiczeichnern\"&gt;.*?&lt;/h2&gt;", Pattern.MULTILINE | Pattern.DOTALL); 
      private Pattern comicEnum = Pattern.compile("&lt;tr&gt;.*?&lt;td.*?&gt;(?:&lt;a.*?\"&gt;)?(.*?)(?:&lt;/a.*?&gt;)?.*?&lt;/td&gt;.*?&lt;td&gt;(?:&lt;a.*?&gt;)?(.*?)(?:&lt;/a&gt;)?.*?&lt;/td&gt;&lt;/tr&gt;", Pattern.MULTILINE | Pattern.DOTALL);  // Tried also this &lt;tr&gt;\\n&lt;td.*?&gt;(?:&lt;a.*?"&gt;)?(.*?)(?:&lt;/a.*?&gt;)?\\n&lt;/td&gt;\\n&lt;td&gt;(?:&lt;a.*?&gt;)?(.*?)(?:&lt;/a&gt;)?\\n&lt;/td&gt;&lt;/tr&gt;
      private Scanner wikiComicFilmScanner = null;
  
      public static void main(String[] args) throws MalformedURLException, IOException {
          Path wikiComicFilmLocal = Paths.get("ressources/ListevonComicverfilmungen.html");
          Parser wp1 = new Parser("file:///" + wikiComicFilmLocal.toAbsolutePath());
          long start = System.currentTimeMillis();
          Map&lt;String, Map&lt;YearInterval, List&lt;String&gt;&gt;&gt; comicMap = wp1.contentToComicFilmsPerYear();
          System.out.println("Parsen ausgeführt in: " + (System.currentTimeMillis() - start) + "ms");
      }
  
      public Parser(String uri) throws MalformedURLException, IOException {
          wikiComicFilmScanner = new Scanner(new URL(uri).openStream(), "UTF-8");
      }
  
  
      public Map&lt;String, Map&lt;YearInterval, List&lt;String&gt;&gt;&gt; contentToComicFilmsPerYear() {
          Map&lt;String, Map&lt;YearInterval, List&lt;String&gt;&gt;&gt; comicMap = new HashMap&lt;&gt;();
          wikiComicFilmScanner.useDelimiter(comicBegin);
          if (wikiComicFilmScanner.hasNext()) {
              wikiComicFilmScanner.next();
          }
          wikiComicFilmScanner.useDelimiter(comicEnd);
          if (wikiComicFilmScanner.hasNext()) {
              String filmsPerYearEnumeration = wikiComicFilmScanner.next();
              Matcher matcherEnum = comicEnum.matcher(filmsPerYearEnumeration);
              while (matcherEnum.find()) {
                  String comicTitle = matcherEnum.group(0);
                  String filmTitle = matcherEnum.group(2);
                  System.out.println("---------------------------------");
                  System.out.println(comicTitle);
                  System.out.println(filmTitle);
              }
          }
          return comicMap;
      }
  
  }
  </code></pre>
  
  <p>Thanks so much!</p>