2017-03-06 4 views
1

dieser Code unten gefunden Text, der zwischen Tags wie <tag></tag> finden, aber ich versuche, gefunden für Texte beginnen und Endpositionen zu finden, zum Beispiel dieses Code Ergebnis ist:Java Startpositionen zwischen Tags

[apple, orange, pear] 

anstelle dieses Ergebnis möchte ich dieses Ergebnis haben:

[5,9], //apple 
[33,38], //orange 
[44,47], //pear 

Code:

public static void main(String[] args) { 
    final String str = "<tag>apple</tag><b>hello</b><tag>orange</tag><tag>pear</tag>"; 
    System.out.println(Arrays.toString(getTagValues(str).toArray())); 
} 

private static final Pattern TAG_REGEX = Pattern.compile("<tag>(.+?)</tag>"); 

private static List<String> getTagValues(final String str) { 
    final List<String> tagValues = new ArrayList<String>(); 
    final Matcher matcher = TAG_REGEX.matcher(str); 
    while (matcher.find()) { 
     tagValues.add(matcher.group(1)); 
    } 
    return tagValues; 
} 

wie kann ich Position von Texten auf diesem Teil des Codes beginnen finden:

while (matcher.find()) { 
     tagValues.add(matcher.group(1)); 
} 
+3

Sie regex nicht XML parsen verwenden, verwenden Java XML-Parsing-Infrastruktur . –

+0

@ tux-world es ist eine schlechte Praxis, Regex für diese Art von Parsing zu verwenden, verwenden Sie XML-Parsing ist sehr einfach und grundlegendes Konzept von Java –

Antwort

1

Wenn Sie formale Parser nicht verwenden möchten, können Sie Ihren Code

ändern
while (matcher.find()) { 
    //tagValues.add(matcher.group(1)); 
    System.out.print("Start index: " + matcher.start(1)); 
    System.out.println(" End index: " + matcher.end(1)); 
    tagValues.add(String.format("[%d,%d]", matcher.start(1), matcher.end(1))); 
} 
+0

Danke, Problem gelöst –

+1

@ tux-world ist es bearbeitbar, aber Sie müssen mit Regex vermeiden wenn mit Tags gearbeitet wird –

0

versuchen, diese:

public static void main(String[] args) { 
    final String str = "<tag>apple</tag><b>hello</b><tag>orange</tag><tag>pear</tag>"; 
    System.out.println(Arrays.toString(getTagValues(str).toArray())); 
} 

private static final Pattern TAG_REGEX = Pattern.compile("<tag>(.+?)</tag>"); 

private static List<String> getTagValues(final String str) { 
    final List<String> tagValues = new ArrayList<String>(); 
    final Matcher matcher = TAG_REGEX.matcher(str); 
    while (matcher.find()) { 
     String found = matcher.group(1); 

     int start = str.indexOf(found); 
     tagValues.add("[" + String.valueOf(start) + ", " + String.valueOf(start + found.length()) + "]"); 
    } 
    return tagValues; 
} 
1

dies Da einen Tag basierte Eingabe wie xml Sie SAX Parsing oder dom Parsing-Techniken verwenden können, .

File inputFile = new File("input.txt"); 
SAXBuilder saxBuilder = new SAXBuilder(); 
Document document = saxBuilder.build(inputFile); 
getAttribute("tag"); 

ansehen Details here