我有一个很大的HTML文件,其中包含很多行
<h1 id="anwendungsfälle-und--funktionen">Anwendungsfälle und -funktionen</h1>
<h1 id="öl">Öl</h1>
我需要替换所有变音符(ü,ö,ä),但只能替换<>中的字符(因此仅用于标题ID,无其他地方。
<h1 id="anwendungsfaelle-und--funktionen">Anwendungsfälle und -funktionen</h1>
<h1 id="oel">Öl</h1>
id可以包含数字,单字符和双字符。我已经耗尽了如何构建Java正则表达式来匹配这些ID的想法。
我尝试过类似的事情
(<h)\d\s(id=")[A-Za-z0-9]*([-]{1}[A-Za-z0-9]*)*(">)
但这是行不通的(我知道这不是Java regex,仅是示例)。
答案 0 :(得分:1)
您可以使用JSoup
:
Document doc = Jsoup.parse(html); // Init the DOM structure
Elements hs = doc.select("*[id]"); // Find all tags with `id` attribute
for(int i = 0; i < hs.size(); i++){ // Iterate through the tags
Element h = hs.get(i); // Get the current element
if (h.tagName().matches("h\\d+")) { // If its tag is a heading tag
String new_val = h.attr("id").replace("ä", "ae").replace("ö", "oe").replace("ü", "ue");
h.attr("id",new_val); // Replace the id attribute with a new one
}
}
System.out.println(doc.toString());
或正则表达式:
Map<String, String> dictionary = new HashMap<String, String>();
dictionary.put("ä", "ae");
dictionary.put("ö", "oe");
dictionary.put("ü", "ue");
String s = "<h1 id=\"anwendungsfälle-und--funktionen\">Anwendungsfälle und -funktionen</h1> \n<h1 id=\"öl\">Öl</h1>";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("(\\G(?!^)|<h\\d+\\s+id=\")([^\"]*?)([üöä])").matcher(s);
while (m.find()) {
m.appendReplacement(result, m.group(1) + m.group(2) + dictionary.get(m.group(3)));
}
m.appendTail(result);
System.out.println(result.toString());
// => <h1 id="anwendungsfaelle-und--funktionen">Anwendungsfälle und -funktionen</h1>
// <h1 id="oel">Öl</h1>
请参见Java demo
正则表达式
(\G(?!^)|<h\d+\s+id=")([^"]*?)([üöä])
请参见online demo。
(\G(?!^)|<h\d+\s+id=")
-第1组:上一个匹配项(\G(?!^)
或(|
)的<h
,1个以上的数字,1个以上的空格, id="
(请参阅<h\d+\s+id="
)([^"]*?)
-第2组:除"
以外的任何0个以上的字符,且尽可能少
([üöä])
-第3组:集合中定义的任何单个字符要在<...>
内部进行匹配,可以使用一个更简单的正则表达式:(\G(?!^)|<)([^<>]*?)([üöä])
。
与针对标记语言使用的所有正则表达式一样,可能存在边缘情况(例如,当>
或<
进行非序列化或有多个属性以不同顺序排列时)当这行不通时。仅在确定使用的数据格式时才使用它。
答案 1 :(得分:-1)
您的正则表达式必须如下所示:
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp" />
<solid android:color="@color/colorwhite" />
请意识到,这并不完美。在某些情况下,这将失败。