0

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

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

PS 相同的正则表达式模式在使用 NSRegularExpression 的 iOS 中工作,但在使用 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(小端)编码。这导致正则表达式无法正常工作的所有问题。我将其更改为 UTF-8,一切都开始工作了。感谢大家的支持。

4

4 回答 4

2

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

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

话虽如此,我真的建议您放弃正则表达式方法并使用适当的 HTML 解析器。

于 2012-06-26T09:04:05.553 回答
1

编辑:

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

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

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

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

于 2012-06-26T09:20:34.513 回答
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>"
于 2012-06-26T09:01:52.237 回答
0

. *可能匹配<。你可以试试 :

<p class=a>([^<]*)</p>
于 2012-06-26T09:05:53.167 回答