Java正则expression式提取标签之间的文本

我有一个自定义标签的文件,我想编写一个正则expression式来提取标签之间的string。 例如,如果我的标签是:

[customtag]String I want to extract[/customtag] 

我如何写一个正则expression式来提取标签之间的string。 这段代码似乎是朝着正确方向迈出的一步:

 Pattern p = Pattern.compile("[customtag](.+?)[/customtag]"); Matcher m = p.matcher("[customtag]String I want to extract[/customtag]"); 

不知道下一步该怎么做。 有任何想法吗? 谢谢。

你在正确的轨道上。 现在您只需要提取所需的组,如下所示:

 final Pattern pattern = Pattern.compile("<tag>(.+?)</tag>"); final Matcher matcher = pattern.matcher("<tag>String I want to extract</tag>"); matcher.find(); System.out.println(matcher.group(1)); // Prints String I want to extract 

如果你想提取多个命中,请试试这个:

 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())); // Prints [apple, orange, pear] } 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; } 

不过,我同意正则expression式不是这里最好的答案。 我将使用XPath来查找我感兴趣的元素。有关更多信息,请参阅Java XPath API 。

说实话,正则expression式并不是这种typesparsing的最佳方法。 你发布的正则expression式可能适用于简单的情况,但是如果事情变得复杂的话,你会遇到很大的问题(同样的原因你不能可靠地用正则expression式parsingHTML)。 我知道你可能不想听到这个,我知道我没有问我相同types的问题,但是我停止尝试使用正则expression式来处理所有事情之后,stringparsing变得更可靠了。

jTopas是一个令人敬畏的标记器,可以很容易的手工编写parsing器(我强烈build议使用标准java扫描程序/ etc。库的jtopas)。 如果你想看到jtopas的行动, 这里有一些parsing器,我用jTopas来parsing这种types的文件

如果您正在parsingXML文件,则应该使用xmlparsing器库。 不要自己动手,除非你只是为了娱乐而做,有充足的certificate选项

寻找标签,属性和价值的通用,简单和原始的方法

  Pattern pattern = Pattern.compile("<(\\w+)( +.+)*>((.*))</\\1>"); System.out.println(pattern.matcher("<asd> TEST</asd>").find()); System.out.println(pattern.matcher("<asd TEST</asd>").find()); System.out.println(pattern.matcher("<asd attr='3'> TEST</asd>").find()); System.out.println(pattern.matcher("<asd> <x>TEST<x>asd>").find()); System.out.println("-------"); Matcher matcher = pattern.matcher("<as x> TEST</as>"); if (matcher.find()) { for (int i = 0; i < matcher.groupCount(); i++) { System.out.println(i + ":" + matcher.group(i)); } } 
  final Pattern pattern = Pattern.compile("tag\\](.+?)\\[/tag"); final Matcher matcher = pattern.matcher("[tag]String I want to extract[/tag]"); matcher.find(); System.out.println(matcher.group(1)); 

尝试这个:

 Pattern p = Pattern.compile(?<=\\<(any_tag)\\>)(\\s*.*\\s*)(?=\\<\\/(any_tag)\\>); Matcher m = p.macthr(anyString); 

例如:

 String str = "<TR> <TD>1Q Ene</TD> <TD>3.08%</TD> </TR>"; Pattern p = Pattern.compile("(?<=\\<TD\\>)(\\s*.*\\s*)(?=\\<\\/TD\\>)"); Matcher m = p.macthr(str); while(m.find()){ Log.e("Regex"," Refex result: " + m.group()) } 

输出:

10恩

3.08%

我在这个答复前加上“你不应该使用一个正则expression式来parsingXML – 它只会导致不正确的边缘情况,并且当你试图修复它时会增加一个永远增加的复杂度的正则expression式“。

这就是说,你需要进行匹配的string,并抓住你想要的组:

 if (m.matches()) { String result = m.group(1); // do something with result } 
  String s = "<B><G>Test</G></B><C>Test1</C>"; String pattern ="\\<(.+)\\>([^\\<\\>]+)\\<\\/\\1\\>"; int count = 0; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(s); while(m.find()) { System.out.println(m.group(2)); count++; }