需要使用正则表达式清除格式错误的标签

时间:2010-06-13 22:31:21

标签: java regex

希望为以下条件找到合适的正则表达式:

我需要清除自由流动文本中的某些标签。例如,在文本中我有两个重要的标记:<2004:04:12><name of person>。不幸的是,有些标签缺少“&lt;”或“&gt;”分隔符。

例如,有些如下:

1) <2004:04:12 , I need this to be <2004:04:12>
2) 2004:04:12>, I need this to be <2004:04:12>
3) <John Doe , I need this to be <John Doe>

我尝试在情况1中使用以下内容:

String regex = "<\\d{4}-\\d{2}-\\d{2}\\w*{2}[^>]";
String output = content.replaceAll(regex,"$0>");

这确实找到了“&lt; 2004:04:12”的所有实例,结果是“&lt; 2004:04:12&gt;”。 但是,我需要消除结束标记之前的空格。

不确定这是最好的方法。任何建议。

由于

2 个答案:

答案 0 :(得分:0)

基本上,你正在寻找负面的预测,如下所示:

String regex = "<\\d{4}-\\d{2}-\\d{2}(?!>)";
String output = content.replaceAll(regex,"$0>");

这将有助于数字“标签”,但由于没有正则表达式可以足够智能匹配任意名称,您必须严格定义非常名称的外观,或处理事实上,“名称”标签不可能采用相同的方法。

答案 1 :(得分:0)

为了修复日期,您可以匹配任何日期,零个一个或两个有角度的括号:

String regex = "(\\s?\\<?)(\\d{4}:\\d{2}:\\d{2})(\\>?\\s)";
String replace = " <$2> ";

要识别名称,我们假设名称的一部分以大写字母开头,唯一的分隔符是空格。我们在开头或结尾明确匹配有角度的括号,名称之前/之后的前一个/后一个字符应该只是一个空格或标点符号。

String regex = "(\\<[A-Z][a-zA-Z]*(\\s[A-Z][a-zA-Z])*)(?=[\\.!?:;\\s])";
String replace = "$1>";

String regex = "(?<=[\\.!?:;\\s])([A-Z][a-zA-Z]*(\\s[A-Z][a-zA-Z]*)*)";
String replace = "<$1";
相关问题