替换标题HTML标记中特定属性内的德语变音符号

时间:2018-08-02 06:49:42

标签: java regex

我有一个很大的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,仅是示例)。

2 个答案:

答案 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" />

请意识到,这并不完美。在某些情况下,这将失败。