java - REGEX 在 Java 中将每行编码的 xml 中的前导空格和制表符替换为 html 代码

标签 java regex

我想用 html 代码替换编码的 xml/html 中的所有前导空格和制表符,每行

通过制表符替换所有 4 个空格组或每个制表符 (#09;) 通过空格 ( ) 替换其余空格 替换可以/必须仅在每行的开头,直到第一个非空格或制表符

示例

Begin of Line: (^|(\\r|\\n)+) => (\\r|\\n)+ multiple linebrakes can be wrapped

Replacmentment chars: [ ], [\t]

21 whitespaces = 5 x #09; + 1 x  
10 Whitespace + 1 tab + 6 whitespaces = 2x #09; + 2x   + 1x #09; + 1x 
#09; + 2x  

:: 10 spaces = 2 x #09 + 2x &nbsp
:: 1 tab = 1x #09
:: 6 spaces = 1 x #09 + 2x &nbsp

输入是一个字符串,之前会被其他正则表达式替换

text = text.replace(regex1, replacement1)
text = text.replace(regex2, replacement2)
text = text.replace(regex3, replacement3)
text = text.replace(regex4, replacement4)

在这个位置我必须实现新的正则表达式

可视化 XML

<TEST>
    <NODE1>
        <VALUE>         Test</VALUE>
    </NODE1>
    <NODE1>
        <VALUE>         Test</VALUE>
    </NODE1>
</TEST>

编码的xml结构,来自视觉等输入字符串

&lt;TEST&gt;
    &lt;NODE1&gt;
        &lt;VALUE&gt;         Test&lt;/VALUE&gt;
    &lt;/NODE1&gt;
    &lt;NODE1&gt;
        &lt;VALUE&gt;         Test&lt;/VALUE&gt;
    &lt;/NODE1&gt;
&lt;/TEST&gt;

预期输出

&lt;TEST&gt;
&#09;&lt;NODE1&gt;
&#09;&#09;&nbsp;&lt;VALUE&gt;         Test&lt;/VALUE&gt; <- NOT replaced in <VALUE>
&#09;&lt;/NODE1&gt;
&#09;&lt;NODE1&gt;
&#09;&#09;&nbsp;&lt;VALUE&gt;         Test&lt;/VALUE&gt; <- NOT replaced in <VALUE>
&#09;&lt;/NODE1&gt;
&lt;/TEST&gt;

我尝试了很多

尝试在正则表达式内存中存储行开头,替换空白组,但失败

result: repeating beginning of the line and html coded spaces/tabs
example: \r&#09;\r&#09;\r&#09;\r&#09;
expected:\r&#09;&#09;&#09;&#09;

"(^|(\\r|\\n))[ ]{4}", "\\1&#09"

尝试在 2 行中做到这一点,首先将 4 个空格替换为制表符,将制表符替换为制表符,然后 第二步将其余空格替换为 &bnsp;但随后它取代了每个空格 尝试了同样的操作,使用 " [ ]", " &nbps;"

我尝试使用 Matcher.find() 循环和子字符串来做到这一点 显示最好但不是 100% 正确的结果。

我失败了并且无法获得正确的正则表达式,有人可以帮忙吗?

最佳答案

下面的program怎么样?使用一堆replaceAll方法和lookbehind s:

    public static void main (String[] args) {
        final String[] INPUT = new String[] {
"<TEST>",
"    <NODE1>",
"         <VALUE>         Test</VALUE>",                // 2 tabs 1 space here
"    </NODE1>",
"    <NODE1>",
"        <VALUE>         Test</VALUE>",
"    </NODE1>",
"</TEST>"
    };

        for (String str: INPUT) {
            System.out.println("NEW: " + htmlspecialchars(str));
        }
    }

    private static String htmlspecialchars(String str) {
        return str
            .replaceAll("&", "&quot;")                  // replace html entities
            .replaceAll("<", "&lt;")
            .replaceAll(">", "&gt;")
            .replaceAll("(?<=^\\s*)\t", "    ")         // replace tabs by 4 spaces
            .replaceAll("(?<=^\\s*)    ", "&#09;")      // replace 4 spaces by &#09;
            .replaceAll("(?<=^(?:&#09;)*) ", "&nbsp;"); // replace rest spaces by &nbsp;
    }

结果输出是:

NEW: &lt;TEST&gt;
NEW: &#09;&lt;NODE1&gt;
NEW: &#09;&#09;&nbsp;&lt;VALUE&gt;         Test&lt;/VALUE&gt;
NEW: &#09;&lt;/NODE1&gt;
NEW: &#09;&lt;NODE1&gt;
NEW: &#09;&#09;&lt;VALUE&gt;         Test&lt;/VALUE&gt;
NEW: &#09;&lt;/NODE1&gt;
NEW: &lt;/TEST&gt;

关于java - REGEX 在 Java 中将每行编码的 xml 中的前导空格和制表符替换为 html 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43068871/

相关文章:

.net - 特定标签的正则表达式

java - Google Sheets Java API 无法将值 append 到多个列

java - 正则表达式处理逗号、双引号、引号

java - Java 字符串数字部分的正则表达式

java - 正则表达式中的负向前瞻匹配所有接受特定字符的内容

php - 替换 PHP 中包含 $ 字符的单词

java - 明确地将新邮件保存到收件箱

java - Web 服务器到应用程序服务器的通信

java - 输出被打印两次

java - 创建 T 类型的 N 维数组并填充它