我没有很多正则表达式的经验,而且我需要将>
和<
的所有实例替换为<
和>
,但是保留HTML标签。
例如:
String string =" <p class=\"anotherClass\"> Here is some text the value is for H<sub>2</sub>O is > 1 and < 100 <p>";
//need to be converted to:
<p class=\"anotherClass\"> Here is some text the value is for H<sub>2</sub>O is > 1 and < 100 <p>";
我已经尝试了一些前瞻性和前后的表达式,但我似乎无法让它们中的任何一个起作用。例如:
String string =" <p class=\"anotherClass\"> Here is some text the value is for H<sub>2</sub>) is > 1 and < 100 <p>";
String reg1="<(?=[^>\\/]*<\\/)";
Pattern p1 = Pattern.compile(reg1);
test = p1.matcher(string).replaceAll("<");
似乎没有任何效果。
我想知道是否有其他人曾经遇到过此问题,或者是否有人可以给我任何指导?
答案 0 :(得分:1)
单独使用正则表达式“解析”HTML标记带来了一些重要的警告,SA上的许多人都对此进行了评论。但是,您的请求相对适中。
标记之间的裸<
符号可以在<(?=[^>]*(?:<|$))
找到,并替换为<
。
标记之间的裸>
符号可以在((?:^|>)[^<]*?)>
找到,并替换为\1>
。
请注意,两者都必须在整个字符串上完成(而不是按行)。例如。 .
必须与\n
匹配,^
必须与字符串的开头(不是行)匹配,$
必须与字符串的结尾(不是行)匹配。
另请注意,每次都必须执行多次,直到没有结果,因为标签之间一次只能进行一次替换。
注意事项:
<
或>
符号这些标签之间,而不是标签本身。这意味着它会像{{1}那样陷入困境}}。要重申其他人提出的观点,请考虑使用标记解析器,如果使用不受信任的输入做任何工作。
答案 1 :(得分:0)
如果所有<
和>
仅出现在其转义版本(<
和>
)中,您就可以匹配并且使用正则表达式删除它们。
但如果他们不是(这似乎是你的情况),最终,由于HTML / XML标签的嵌套特性,你只能使用正则表达式来达到100%的准确度。
您最好的选择是 HTML解析器,例如 jsoup :
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JsoupExtractGtLt {
public static void main(String[] args) {
String html = "<p class=\"anotherClass\"> Here is some text the value is for H<sub>2</sub>) is > 1 and < 100 <p>";
Document doc = Jsoup.parseBodyFragment(html);
String parsedHTML = doc.body().unwrap().toString();
System.out.println(parsedHTML);
}
}
输出:
<p class="anotherClass"> Here is some text the value is for H<sub>2</sub>) is > 1 and < 100 </p>