2017-03-06 103 views
1

之间的起始位置这下面的代码可以找到的文字它们是标签之间等作为<tag></tag> 但我试图找到启动和发现文本结束位置,例如该代码的结果是:爪哇发现标签

[apple, orange, pear] 

,而不是这个结果,我想有这样的结果:

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

代码:

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; 
} 

我怎么能找到开始的这部分代码文本的位置:

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

不要使用正则表达式来解析XML,使用Java的XML解析基础设施。 –

+0

@ tux-world它是一种不好的做法,使用正则表达式进行这种解析,使用XML解析它是非常容易和基本的概念java –

回答

1

如果你不想使用正规的分析器,您可以修改代码

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

谢谢,问题解决 –

+1

@ tux-world它是可行的,但你需要避免使用正则表达式在使用标签时 –

0

试试这个:

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

由于这就像xml一个基于标签的输入,你可以使用SAX解析或dom解析技术。

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

查看完整的细节here