2016-10-27 1 views
0

Der String ist so zu einer Variablen fromFile zugeordnet wird:Wie vereinfache ich meine zwei REGEX zu einem?

<!DOCTYPE html> 
<!-- 
To change this license header, choose License Headers in Project Properties. 
To change this template file, choose Tools | Templates 
and open the template in the editor. 
--> 
<html> 
    <head> 
     <title>TODO supply a title</title> 
     <meta charset="UTF-8"> 
     <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    </head> 
    <body> 
     <div>TODO write content</div> 

     <span class="test"></span> 
     <ruby> 
     text1<rp>(</rp><rt>textA</rt><rp>)</rp> 
     text2<rp>(</rp><rt>textB</rt><rp>)</rp> 
     text3<rp>(</rp><rt>textC</rt><rp>)</rp> 
     </ruby> 
     <img src="images/aaaaa.jpg"> 
     <img src="./audio/bbbbb.mp3"> 
     <img src="../../audio/ccccc.mp3"> 
     <img class="aaaa"> 
     <input class="bbbb"> 
     <audio controls> 
      <source src="horse.ogg" type="audio/ogg"> 
      <source src="horse.mp3" type="audio/mpeg"> 
      Your browser does not support the audio element. 
     </audio> 
    </body> 
</html> 

und meine Reguläre Ausdrücke sind:

final Pattern pattern = Pattern.compile("(<rt>(.+?)</rt>)|(?=(\\b(\\w*\\S)\\b)<rp>)"); 
final Pattern pattern2 = Pattern.compile("(?=(\\b(\\w*\\S)\\b)<rp>)"); 
final Matcher matcher = pattern.matcher(fromFile); 
final Matcher matcher2 = pattern2.matcher(fromFile); 
while(matcher.find()) { 
    matcher2.find(); 
    fromFile = "<font class=\"ruby\" title=\"" + matcher.group(1) + "\"" + ">" + matcher2.group(1) + "</font>"; 

    break; 
} 
if((matcher.find()) != true) { 
    System.out.println(fromFile); 
} 

Ich mag würde es machen einfach nur mit Ein Regulärer Ausdruck, der die gleiche Ausgabe erzeugt. Der erste Regex extrahiert das Element innerhalb der <rt></rt> und der zweite erhält die Daten vor dem Tag <rp>. Ich habe sie zugewiesen, wobei die extrahierten Daten zu matcher.group(1) und matcher2.group(1) gefunden wurden.

Antwort

0

Sie einen regulären Ausdruck schreiben, indem Sie eine Zeile für Zeile Parsen

Pattern pattern = Pattern.compile("(\\S+)<rp>.*<rt>(\\S+)<\\/rt>.*"); 

vollständige Code

List<String> lines = null; 
    try (BufferedReader br = new BufferedReader(new FileReader(new File("pathToFile")))) { 
     lines = br.lines().collect(Collectors.toList()); //File content to List<String> 
    } 
    Pattern pattern = Pattern.compile("(\\S+)<rp>.*<rt>(\\S+)<\\/rt>.*"); 
    for (String line : lines) { 
     Matcher matcher = pattern.matcher(line); 
     while (matcher.find()) { 
      System.out.println(matcher.group(1) + " " + matcher.group(2)); 
     } 
    } 

Ausgang

text1 textA 
text2 textB 
text3 textC 
+0

Dank sowohl die Saiten auf der gleichen Linie entsprechen @ Saravana! –

Verwandte Themen