从字符串</xxxx>中提取所有<xxxx>标记

时间:2014-02-03 17:25:54

标签: java android regex

我一直在尝试在字符串中提取“指针”,以使用正则表达式将它们替换为实际值。源字符串是从数据库中提取的,可以是几种形式 - 我希望你能看出我的意思:

我需要从中提取信息的字符串格式为<X Description> blah blah <Y> blah blah blah <Z Differentdescription>

我需要提取

<X Description>,
<Y>,
<Z Differentdescription>

来自字符串(以便在显示给用户之前可以用实际值替换它们。)

我认为这样的事情会起作用:(<[XYZ]( \w+)?>)+

但是,它只捕获“<X Description>”标签(它的含义),以及“描述”(我不太明白),并且不捕获{{1 }或<Y>

我不是要解析XML或HTML(我知道这是用正则表达式不赞成的),并且不会有任何嵌套标签,我只需要获得匹配序列。

最终这将用于Android应用程序,但我需要首先使用正则表达式!

2 个答案:

答案 0 :(得分:1)

你可以使用正面看法和正面向前看这样:

String str = "<X Description> blah blah <Y> blah blah blah <Z Differentdescription>";
Pattern pattern = Pattern.compile("(?<=<)[\\w\\s]+?(?=>)");
Matcher m = pattern.matcher(str);
while(m.find()){
    System.out.println(m.group(0));
}
  1. (小于?=≤)[\ W \ S] +? - 将匹配<后跟任何字或空格
  2. [\ w \ s] +?(?=&gt;) - 将匹配任何字词/空格,后跟>
  3. 输出:

    X Description
    Y
    Z Differentdescription
    

答案 1 :(得分:0)

你的正则表达式,(<[XYZ]( \w+)?>)+接近于你想做的事情,但第二组括号(即( \w+))也形成了一个捕获。

如果您将正则表达式更改为(<[XYZ](?: \w+)?>),它应该可以正常工作。 ?:使括号无法捕获。

  

并且不会捕获<Y><Z Description>

这是因为您没有在正则表达式中使用g选项,所以它在第一次匹配后终止。