希望为以下条件找到合适的正则表达式:
我需要清除自由流动文本中的某些标签。例如,在文本中我有两个重要的标记:<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;”。 但是,我需要消除结束标记之前的空格。
不确定这是最好的方法。任何建议。
由于
答案 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";