专门应用 java 模式匹配器来提取 html 个元素,忽略一些字符

exclusively apply java pattern matcher to extract html elements, ignore some characters

我正在使用此代码:

Pattern pat_1 = Pattern.compile("class=\"\"pinyin\"\">(.*?)<script>");
Matcher mat_1 = pat_1.matcher( text );
while( mat_1.find() )
{
    System.out.println( mat_1.group(1) );
}

这是匹配的输入数据源:

<br>
<span class=""b"">拼音:</span><span class=""pinyin"">xī<script>Setduyin('Duyin/xi1')</script></span> <span class=""b"">注音:</span><span class=""pinyin"">ㄒㄧ<script>Setduyin('Duyin/xi1')</script></span><br>
<span class=""b"">简体部首:</span>丨 <span class=""b"">部首笔画:</span>1 <span class=""b"">总笔画:</span>8<br><span class=""b"">繁体部首:</span>卜 <span class=""b"">部首笔画:</span>2 <span class=""b"">总笔画:</span>8<br><span class=""b"">康熙字典笔画</span>( 卥:8; )

我的代码的问题是它也选择了 ㄒㄧ,因为前面的元素和处理的元素是相同的。我怎么能排除 ㄒㄧ 而只排除 select 。也许我可以使用 <br> 标签,因为这是第一次使用时所特有的东西,但这需要标识一个新行并忽略 拼音: 如何做到这一点?我一直在玩 regex101.com 但我还不能确定它。

所以现在要清楚 java 代码的输出是

xī
ㄒㄧ

但我只希望它是

您可以试试下面的正则表达式。

Pattern pat_1 = Pattern.compile("class=\"\"pinyin\"\">(.*?)<script>(?:(?!<script>).)*");

DEMO

(?m)^.*?class=\"\"pinyin\"\">(.*?)<script>

(?m) 称为多行修饰符,在正则表达式中使用锚 ^$ 时启用此修饰符是安全的。

DEMO