0

这是 HTML 代码:

         <td class="foobar" id="12345POE46" data="more &amp; data">
               <a href="http://www.stackoverflow.com" more="{data}">Value</a>                    </td>

现在,我对正则表达式并不陌生,但我对 Java 中的正则表达式并不陌生。我唯一不知道的是如何在 Java 中使用这个正则表达式,这是我用来从代码中提取值的那个:

(?s)<td class="foobar".*?<a.*?>(.*?)</a>.*?</td>

我需要 ,因为和(?s)之间有换行符。<td><a>

根据我的研究,我在 Java 中需要做的就是将DOTALL参数传递给模式编译函数:

p = Pattern.compile(regex, Pattern.DOTALL);

然后这个正则表达式应该工作:

<td class="foobar".*?<a.*?>(.*?)</a>.*?</td>

因为 DOTALL 参数的行为应该像(?s)标志。

但它不起作用。我搜索了一段时间,但无法找出问题所在。


这就是我阅读 HTML 代码的方式:

URL web = new URL(webURL); 
URLConnection gate = web.openConnection(); 
BufferedReader in = new BufferedReader(new InputStreamReader(gate.getInputStream()));
String inputLine = in.readLine();

更新:

  • 我用我的正则表达式测试了相同的代码,它在我尝试过的所有在线正则表达式测试器中都能完美运行(带有(?s)标志)。

  • 我用 Python 编写了所有代码,一切都相同,并且(?s)当我从通过 Java 索引的网页 HTML 中放入相同的字符串时,它与标志完美配合。

4

2 回答 2

1

Your original version with the (?s) should work perfectly fine, since Java supports match flags. You don't need DOTALL if you specify the flag inline.

Update: If your pattern isn't matching, it's for some other reason. This code:

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

public class MatchFlags {
    public static void main(String[] args) {
        String s = "foo\nbar";
        System.out.println(s.matches("foo.bar"));
        System.out.println(s.matches("(?s)foo.bar"));
        Matcher m = Pattern.compile("foo.bar", Pattern.DOTALL).matcher(s);
        System.out.println(m.matches());
    }
}

produces this output:

false
true
true

As you can see, either the (?s) inline flag or the DOTALL flag will cause the wildcard to match line feeds.

Further, the sample you gave works fine if you add a terminating </td> to it:

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

public class MatchFlags {
    public static void main(String[] args) {
        String in =
            "<td class=\"foobar\" id=\"12345POE46\" data=\"more &amp; data\">\n" +
            "    <a href=\"http://www.stackoverflow.com\" more=\"{data}\">Value</a>\n" +
            "</td>";
        Matcher matcher = Pattern
                .compile("(?s)<td class=\"foobar\".*?<a.*?>(.*?)</a>.*?</td>")
                .matcher(in);
        System.out.println(matcher.find());
        System.out.println(matcher.group(1));
    }
}

produces:

true
Value
于 2013-06-14T03:18:56.963 回答
0

您的正则表达式对我来说似乎工作正常,我使用以下代码进行测试:

String s = "  <td class=\"foobar\">\n"
         + "\n"
         + "        <a href=\"http://www.webaddress.com\">Value</a>        </td>\n";
String regex = "<td class=\"foobar\".*?<a.*?>(.*?)</a>.*?</td>";
Pattern p = Pattern.compile(regex, Pattern.DOTALL);
Matcher m = p.matcher(s);
if (m.find()) {
    System.out.println("Found a match!\n");
}

示例:http: //ideone.com/geoLlA

于 2013-06-13T22:33:49.793 回答