如何使用正则表达式匹配字符串

时间:2012-06-26 08:56:41

标签: java android regex

我有一个字符串,其中包含"<p class=a> ... </p>"的多次出现,其中......是不同的文本。

我正在使用"<p class=a>(.*)</p>"正则表达式模式将文本拆分为块。但这不起作用。什么是正确的正则表达式?

P.S。相同的正则表达式模式在iOS中使用NSRegularExpression但在使用Pattern的android中无效。

更多地解释我的问题:我正在做以下

Pattern regex3 = Pattern.compile("(?s)<P Class=ENCC>(.*?)</P>", CASE_INSENSITIVE);
String[] result = p.split(str); 

结果数组只包含1个项目,它是整个字符串

以下是我正在阅读的文件的一部分:

<BODY>
    <SYNC Start=200>
      <P Class=ENCC><i>Cerita, Watak, Adegan dalam</i><br/><i>Drama Ini Rekaan Semata-Mata.</i></P>
    </SYNC>
    <SYNC Start=2440>
      <P Class=ENCC>&nbsp;</P>
    </SYNC>
    <SYNC Start=2560>
      <P Class=ENCC><i>Kami Tidak Berniat</i><br/><i>Melukakan Hati Sesiapa.</i></P>
    </SYNC>
    <SYNC Start=4560>
      <P Class=ENCC>&nbsp;</P>
    </SYNC>
    <SYNC Start=66160>
      <P Class=ENCC>Hai kawan-kawan.<br/>Inilah bandaraya Banting.</P>
    </SYNC>

更新::::

大家好,我遇到了问题。问题实际上是我正在阅读的文件的编码。该文件是UTF-16(Little Endian)编码的。这导致正则表达式的所有问题都无法正常工作。我把它改成了UTF-8,一切都开始工作了......感谢所有人的支持。

4 个答案:

答案 0 :(得分:2)

使用正则表达式解析HTML并不是一个好主意(原因here)。您应该在HTML解析器中使用什么,例如this

话虽如此,你的问题很可能是*运营商贪婪的事实。在您的问题中,您只是说它不起作用,所以我认为您的问题是因为它匹配第一个<p class=a>和最后一个</p>。使正则表达式非贪婪,如下所示:<p class=a>(.*?)</p>(注意额外的?以使*运算符不贪婪)应该解决问题(假设你的问题是我的问题)如前所述)。

话虽这么说,我真的建议你放弃正则表达式方法并使用适当的HTML解析器。

答案 1 :(得分:1)

修改

现在您已经发布了与之匹配的代码和文本,有一件事立即浮现在脑海中:

您正在匹配<p class...,但您的字符串包含<P Class...。正则表达式区分大小写。

然后,.与换行符不匹配。而且你的段落很可能包含换行符。

因此,请尝试"(?si)<p class=a>(.*?)</p>"(?s)修饰符也允许点匹配换行符,(?i)修饰符使正则表达式不区分大小写。

答案 2 :(得分:0)

我想问题是你的模式是贪婪的。你应该改用它。

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

如果你有这个字符串:

"<p class=a>fist</p><p class=a>second</p>"

您的模式("<p class=a>(.*)</p>")将与此匹配

"<p class=a>fist</p><p class=a>second</p>"

虽然"<p class=a>(.*?)</p>"仅匹配

"<p class=a>fist</p>"

答案 3 :(得分:0)

。* 可能与&lt; 匹配。你可以尝试:

<p class=a>([^<]*)</p>