模式匹配java:不起作用

时间:2009-07-03 09:44:22

标签: java regex

我正在尝试使用java在html页面中找到某个标记。所有我知道的是什么样的标签(div,span ...)和id ...我不知道它看起来如何,标签中有多少个空格或其他内容...所以我想到使用模式匹配我有以下代码:

 // <tag[any character may be there or not]id="myid"[any character may be there or not]>
 String str1 = "<" + Tag + "[.*]" + "id=\"" + search + "\"[.*]>";
 // <tag[any character may be there or not]id="myid"[any character may be there or not]/>
 String str2 = "<" + Tag + "[.*]" + "id=\"" + search + "\"[.*]/>";
 Pattern p1 = Pattern.compile( str1 );
 Pattern p2 = Pattern.compile( str2 );
 Matcher m1 = p1.matcher( content );
 Matcher m2 = p2.matcher( content );
 int start = -1;
 int stop = -1;
 String Anfangsmarkierung = null;
 int whichMatch = -1;

 while( m1.find() == true || m2.find() == true ){

        if( m1.find() ){
            //System.out.println( " ... " + m1.group() );
            start = m1.start();
            //ende = m1.end();
            stop = content.indexOf( "<", start );
            whichMatch = 1;
        }
        else{
            //System.out.println( " ... " + m2.group() );
            start = m2.start();
            stop = m2.end();
            whichMatch = 2;
        }
 }

但我得到m1(m2).start()的异常,当我输入没有[。*]的实际标签时,当我输入正则表达式时我得到任何东西:( ...我真的没找到对此的解释......我还没有使用模式或匹配,所以我有点失落,到目前为止还没有找到任何东西。如果有人能解释我做错了什么或者我怎么做的话会很棒更好......

提前thnx:)

... dg

3 个答案:

答案 0 :(得分:3)

我知道我正在扩大您的问题,但我认为使用专用库来解析HTML文档(例如:http://htmlparser.sourceforge.net/)将比正则表达式更容易和准确。

答案 1 :(得分:1)

我认为对find的每次通话都会在您的比赛中前进。在您的条件中调用m1.find()会将您的匹配器移动到不再存在有效匹配的位置,这会导致m1.start()抛出(我猜测)IllegalStateException确保您调用查找每次迭代一次并引用某些标志的结果可以避免这个问题。

boolean m1Matched = m1.find()
boolean m2Matched = m2.find()
while( m1Matched || m2Matched ) {

            if( m1Matched ){
                ...
            }

m1Matched = m1.find();
m2Matched = m2.find();
}

答案 2 :(得分:1)

以下是您尝试根据我的一个注释改编的示例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {

        String tag = "thetag";
        String id = "foo";

        String content = "<tag1>\n"+
                "<thetag name=\"Tag Name\" id=\"foo\">Some text</thetag>\n" +
                "<thetag name=\"AnotherTag\" id=\"foo\">Some more text</thetag>\n" +
                "</tag1>";

        String patternString = "<" + tag + ".*?name=\"(.*?)\".*?id=\"" + id + "\".*?>";

        System.out.println("Content:\n" + content);
        System.out.println("Pattern: " + patternString);

        Pattern pattern = Pattern.compile(patternString);

        Matcher matcher = pattern.matcher(content);

        boolean found = false;
        while (matcher.find()) {
            System.out.format("I found the text \"%s\" starting at " +
                    "index %d and ending at index %d.%n",
                    matcher.group(), matcher.start(), matcher.end());
            System.out.println("Name: " + matcher.group(1));
            found = true;
        }
        if (!found) {
            System.out.println("No match found.");
        }
    }
}

您会注意到模式字符串变为<thetag.*?name="(.*?)".*?id="foo".*?>,它会搜索名为 thetag 的标记,其中 id 属性设置为“foo” 。

请注意以下事项:

  • 它使用.*?弱地匹配零个或多个任何内容(如果您不理解,请尝试删除?以查看我的意思。)
  • 它使用括号(name="(.*?)"部分)之间的子匹配表达式来提取名称属性的内容(作为示例)。