Java:Regex删除XML文件的一部分
我正在阅读一个维基百科XML文件,其中我必须删除大括号之间的任何内容。 例如,对于以下字符串: String text=“{{使用dmy日期|日期=2012年11月}}{{Infobox” 艺术家|姓名Java:Regex删除XML文件的一部分,java,regex,parsing,wikitext,Java,Regex,Parsing,Wikitext,我正在阅读一个维基百科XML文件,其中我必须删除大括号之间的任何内容。 例如,对于以下字符串: String text=“{{使用dmy日期|日期=2012年11月}}{{Infobox” 艺术家|姓名 =Russ Conway | image=| caption=Russ Conway,摄于其1959年[[Extended play | EP]]的正面 派对弹出“”。|图像大小=|背景= 非声乐乐器演奏家出生姓名=特雷弗·赫伯特 斯坦福大学|别名=|出生日期={{出生 日期| 1925 | 0
=Russ Conway | image=| caption=Russ Conway,摄于其1959年[[Extended play | EP]]的正面 派对弹出“”。|图像大小=|背景= 非声乐乐器演奏家出生姓名=特雷弗·赫伯特 斯坦福大学|别名=|出生日期={{出生 日期| 1925 | 09 | 2 | df=y}|出生地=[[Bristol]], [[英国]],英国|死亡日期={{死亡日期和 年龄| 2000 | 11 | 16 | 1925 | 09 | 02 | df=y}死亡|地点= [[Eastbourne]],[[Sussex]],英国英格兰|原籍=| 乐器=[[钢琴]]|流派=|职业 =[[音乐家]]|活跃年数=|标签=EMI(哥伦比亚)、派伊、音乐媒体、丘吉尔|联合演出=| 网站=|值得注意的工具=}}” 应将其替换为空字符串。注意,该示例有多个新行和嵌套的{{…} 我正在使用以下代码:
Pattern p1 = Pattern.compile(".*\\({\\{.+\\}\\}).*", Pattern.DOTALL);
Matcher m1 = p1.matcher(text);
while(m1.find()){
String text1 = text.replaceAll(m1.group(1), "");
}
我是新加入regex的,你能告诉我我做错了什么吗 对于正则表达式,这通常是不可能的。常规语言无法描述任意级别的嵌套,因为它们无法“计算”它们所处的级别 如果绝对必须使用正则表达式,则可以通过手动编码所有嵌套可能性,创建一个可用于三级嵌套的繁琐表达式。但这将是非常麻烦的,实际上是对DRY的违反,而且远不是适合这项工作的合适工具 如果需要的话,“用手”可能更容易做到这一点。自己扫描字符串,每次点击
{
增加“大括号级别”;每次点击}
减少它。当且仅当大括号级别为零时,将每个字符复制到输出
类似于(未经测试):
StringBuilder输出=新建StringBuilder();
char[]input=text.toCharArray();
int-level=0;
for(int i=0;i0){
//检查是否有与上述类似的闭合支撑
如果(i
您应该尝试找到一个合适的解析器。Java的正则表达式不适合未定义的嵌套级别。您所犯的错误是,+
是贪婪的,并且将从第一个{{
之后到最后一个}之前匹配
。除了您正在使用的编程语言之外,您拥有所有的标记。@Jerry这就是我想要的,删除第一个“{{”和最后一个“}}”之间的任何内容@user2823318,这意味着您的变量文本将变为空?该字符串中的第一个字符是{
,最后一个是}
…好吧,不是空的,而是只{{}
.Regex来删除XML文件的一部分-这是个坏主意。你可以为这些东西提供一个合适的XML解析器。这非常有效。我希望我不必求助于此。谢谢你的输入。
StringBuilder output = new StringBuilder();
char[] input = text.toCharArray();
int braceLevel = 0;
for (int i = 0; i < input.length; i++) {
final char c = input[i];
if (c == '{') {
// Check for {{
if (i < input.length - 1 && input[i+1] == '{') {
// Yep, it's a double brace - increase the level, consume
// the second character and continue with the next char
braceLevel++;
i++;
continue;
}
}
else if (c == '}' && braceLevel > 0) {
// Check for a closing brace similar to above
if (i < input.length - 1 && input[i+1] == '}') {
braceLevel--;
i++;
continue;
}
}
if (braceLevel == 0) {
output.append(c);
}
}
// Now output contains every character that was not contained within brackets