我想用 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  
:: 1 tab = 1x #09
:: 6 spaces = 1 x #09 + 2x  
输入是一个字符串,之前会被其他正则表达式替换
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结构,来自视觉等输入字符串
<TEST>
<NODE1>
<VALUE> Test</VALUE>
</NODE1>
<NODE1>
<VALUE> Test</VALUE>
</NODE1>
</TEST>
预期输出
<TEST>
	<NODE1>
		 <VALUE> Test</VALUE> <- NOT replaced in <VALUE>
	</NODE1>
	<NODE1>
		 <VALUE> Test</VALUE> <- NOT replaced in <VALUE>
	</NODE1>
</TEST>
我尝试了很多
尝试在正则表达式内存中存储行开头,替换空白组,但失败
result: repeating beginning of the line and html coded spaces/tabs
example: \r	\r	\r	\r	
expected:\r				
"(^|(\\r|\\n))[ ]{4}", "\\1	"
尝试在 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("&", """) // replace html entities
.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll("(?<=^\\s*)\t", " ") // replace tabs by 4 spaces
.replaceAll("(?<=^\\s*) ", "	") // replace 4 spaces by 	
.replaceAll("(?<=^(?:	)*) ", " "); // replace rest spaces by
}
结果输出是:
NEW: <TEST>
NEW: 	<NODE1>
NEW: 		 <VALUE> Test</VALUE>
NEW: 	</NODE1>
NEW: 	<NODE1>
NEW: 		<VALUE> Test</VALUE>
NEW: 	</NODE1>
NEW: </TEST>
关于java - REGEX 在 Java 中将每行编码的 xml 中的前导空格和制表符替换为 html 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43068871/