使用正则表达式清理文本

时间:2015-02-06 16:10:54

标签: java regex string

我正在阅读一个文本文件,我想找到正确的文本标记。但我在句子末尾有点问题。我的代码是以下代码,查询意味着输入字符串:

    query = query.replaceAll("[^\\p{L}\\s0-9-_/.]", "");
    query = query.replaceAll("\t", " ");
    query = query.replaceAll("\r", " ");
    query = query.replaceAll("\n", " ");
    StringTokenizer words = new StringTokenizer(query, " ");    
    while(tokens.hasMoreTokens()){
            String str=tokens.nextToken();
            String regex = "\\d+.\\d+";
            if(!str.matches(regex)) *<- second problem*
               System.out.println(str);

例如;输入文本是以下行

THE WORLD OF UNIQUE VENDING CARTS. fy_lkaris@yahoo.com  www.ubc_lib?9867.come/homepage 876454 9890-9999-9099.

我希望以下字符串作为输出

THE WORLD OF UNIQUE VENDING CARTS
fy_lkaris@yahoo.com
www.ubc_lib?9867.come/homepage
9890-9999-9099

但是我的实际输出在第一行和最后一行输出结束时有点。 我不能删除点(。),因为它从每个地方删除。

THE
WORLD
OF
UNIQUE
VENDING
CARTS.ff_lashkariyahoo.com   *<-problem*
www.unb_lib9867.come/homepage
9890-9999-9099.              *<-problem*

另外我想只删除像4,764,90.900而不是76-098-098这样的数字,我找不到比使用匹配功能更好的功能。是否有办法解决这个问题。< / p>

你能帮我吗?

2 个答案:

答案 0 :(得分:1)

问题是在字符类中间存在未转义的连字符。只有当连字符放置在字符类中的开始或结束位置时,才能取消连字符。

使用此:

query = query.replaceAll("[^\\p{L}\\s0-9_/.-]", "");

当连字符出现在中间时,它会作为范围。在你的情况下,它创建一个数字9(ASCII:57)和下划线(ASCII:95)之间的范围。

答案 1 :(得分:0)

我找到了解决问题的方法。我将我的代码更改为以下代码,它可以正常工作。

query = query.replaceAll("[^\\p{L}\\s0-9-_/.@]", "");
query = query.replaceAll("\t", " ");
query = query.replaceAll("\r", " ");
query = query.replaceAll("\n", " ");
StringTokenizer words = new StringTokenizer(query, " ");    
while(tokens.hasMoreTokens()){
        String str=tokens.nextToken();
        str = str.replaceAll("\\.\\B" , " "); *<-new line*
        String regex = "\\d+.\\d+";
        if(!str.matches(regex)) *<- second problem*
           System.out.println(str);