在Java中使用正则表达式中的HTML标签的风格

问题描述:

我存储在一个Java代码的字符串变量的HTML代码“改造” CSS样式,在这个字符串我有这样的事情:在Java中使用正则表达式中的HTML标签的风格

<span style="text-decoration: underline;">test</span> 

而且我想是这样的

<u>test</u> 

或者,如果我有这样的:

<span style="color: #2873ee; text-decoration: underline;">test</span> 

我想这一点:

<font color="#2873ee"><u>test</u></font> 

使用正则表达式我可以这样做:

affectedString.replaceAll("<span style=\"text-decoration: underline;\">(.*?)<\\/span>", "<u>$1</u>"); 

affectedString.replaceAll("<span style=\"color:\\s*?(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}); text-decoration: underline;\">(.*?)<\\/span>", "<u><font color=\"$1\">$2</u></font>"); 

容易吧?但我有几个问题,也不喜欢这个代码。 首先,我为什么不喜欢这个?因为我需要在CSS样式使用此:下划线,颜色和线通过,并写巧合的每一种情况下是不是一个很好的代码,例如:

affectedString.replaceAll("<span style=\"color:\\s*?(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}); text-decoration: underline;\">(.*?)<\\/span>", "<u><font color=\"$1\">$2</u></font>"); 
affectedString.replaceAll("<span style=\"text-decoration: underline; color:\\s*?(#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3});\">(.*?)<\\/span>", "<u><font color=\"$2\">$1</u></font>"); 

而且问题是这不工作与像一个代码:

<span style="text-decoration: underline;">test <span style="text-decoration: line-through;">two</span></span> 

在当我尝试应用该正则表达式这种情况下,部分匹配,直到第一</span>,所以最后的结果是:

<u>test<span style="text-decoration:line-through;">two</u></span> 

这是当我匹配文本修饰:下划线,然后当我匹配文本修饰:直通。第二个结果是:

<u>test <strike>two</u></strike> 

当预期的结果是

<u>test <strike>two</strike></u> 

我的问题是,什么样的正则表达式我可以用它来解决这类问题?将这个简单的css“转换”成html标签有更好的解决方案吗?

谢谢

+0

你不应该使用正则表达式解析XML/HTML。 – user2004685

+0

任何你或其他答案者为这样的任务提供的任何正则表达式都会很复杂,容易出错并且看起来很丑陋。你确实需要某种类型的html分析器/解析器 –

我建议不要使用正则表达式。调试/扩展并不容易,并且非常快速。您可以使用像jsoup这样的库来解析HTML,遍历DOM并使用CSS选择器来获取元素。例如。获取与class所有div属性,你会使用

Elements divs = doc.select("div[class]");