用于在标记之间提取数据的Java正则表达式

时间:2010-09-15 15:49:39

标签: java regex

我正在尝试使用正则表达式来从类似

的字符串中提取数据
<B Att="text">Test</B><C>Test1</C>

提取的输出需要是Test和Test1。这就是我到目前为止所做的事情:

public class HelloWorld {
    public static void main(String[] args)
    {
        String s = "<B>Test</B>";
        String reg = "<.*?>(.*)<\\/.*?>";
        Pattern p = Pattern.compile(reg);
        Matcher m = p.matcher(s);
        while(m.find())
        {
            String s1 = m.group();
            System.out.println(s1);
        }
    }
}

但这会产生结果<B>Test</B>。谁能指出我做错了什么?

4 个答案:

答案 0 :(得分:7)

三个问题:

  • 您的测试字符串不正确。
  • 您需要在群组中使用非贪婪的修饰符。
  • 您需要指定所需的组(组1)。

试试这个:

String s = "<B Att=\"text\">Test</B><C>Test1</C>"; // <-- Fix 1
String reg = "<.*?>(.*?)</.*?>";                   // <-- Fix 2
// ...
String s1 = m.group(1);                            // <-- Fix 3

你也不需要逃避正斜杠,所以我删除了它。

ideone上看到它正在运行。

(另外,不要使用正则表达式来解析HTML - 使用HTML解析器。)

答案 1 :(得分:2)

如果您正在使用eclipse,那么有一个很好的插件可以帮助您检查正则表达式,而无需编写任何类来检查它。 这是链接: http://regex-util.sourceforge.net/update/ 您需要通过选择Window - &gt;来显示视图。显示视图 - &gt;其他,而不是Regex Util

我希望它能帮助你与正则表达式作斗争

答案 2 :(得分:1)

看起来你正试图在XML和/或HTML上使用正则表达式。我建议不要使用正则表达式,而是创建一个解析器或词法分析器来处理这种类型的安排。

答案 3 :(得分:1)

我认为处理XML节点的最佳途径只是将其视为XML

如果你真的想坚持regex尝试:

<B[^>]*>(.+?)</B\s*>

了解您将始终获得B代码的价值。

或者,如果您想要任何标签的值,您将使用以下内容:

<.*?>(.*?)</.*?>