【问题标题】:How to replace all special characters with another character in java?如何用java中的另一个字符替换所有特殊字符?
【发布时间】:2014-05-18 06:17:30
【问题描述】:

我想用java中的特殊字符替换所有“特殊字符”

例如,“cash&carry”将变为“cash+carry”,“cash$carry”将变为“cash+carry”

我有一个示例 CSV 文件

这里的 CSV 标题是“What”和“Where”

What,Where
salon,new+york+metro
pizza,los+angeles+metro
crate&barrel,los+angeles+metro
restaurants,los+angeles+metro
gas+station,los+angeles+metro
persian+restaurant,los+angeles+metro
car+wash,los+angeles+metro
book store,los+angeles+metro
garment,los+angeles+metro
"cash,carry",los+angeles+metro
cash&carry,los+angeles+metro
cash carry,los+angeles+metro

预期输出

What,Where
salon,new+york+metro
pizza,los+angeles+metro
crate+barrel,los+angeles+metro
restaurants,los+angeles+metro
gas+station,los+angeles+metro
persian+restaurant,los+angeles+metro
car+wash,los+angeles+metro
book+store,los+angeles+metro
garment,los+angeles+metro
cash+carry,los+angeles+metro
cash+carry,los+angeles+metro
cash+carry,los+angeles+metro

示例代码如下

String csvfile="BidAPI.csv"; 

 try{

        // create the 'Array List'
        ArrayList<String> What=new ArrayList<String>();
        ArrayList<String> Where=new ArrayList<String>();

    BufferedReader br=new BufferedReader(new FileReader(csvfile));
        StringTokenizer st=null;
        String line="";
        int linenumber=0;
        int columnnumber;
        int free=0;
        int free1=0;    

        while((line=br.readLine())!=null){
            linenumber++;
            columnnumber=0;

            st=new StringTokenizer(line,",");
            while(st.hasMoreTokens()){
                columnnumber++;
                String token=st.nextToken();
                if("What".equals(token)){
                    free=columnnumber;
                    System.out.println("the value of free  :"+free);
                    } else if("Where".equals(token)){
                    free1=columnnumber;
                    System.out.println("the value of free1 :"+free1);
                    } 

                    if(linenumber>1){

                if (columnnumber==free){
                    What.add(token);    
                } else if(columnnumber==free1){
                    Where.add(token);
                }
            }
        }
    }


    // converting the  'What' Array List to array
    String[] what=What.toArray(new String[What.size()]);

    // converting the 'Where' Array List to array
    String[] where = Where.toArray(new String[Where.size()]);

    for(int i=0;i<what.length;i++){
    String data = what[i].replaceAll("[^A-Za-z0-9\",]| (?!([^\"]*\"){2}[^\"]*$)", "+").replace("\"", "");
    System.out.println(data);
    System.out.println(where[i]);
    String finaldata = data+where[i];
    String json = readUrl(desturl);
    br.close();
    }catch(Exception e){
        System.out.println("There is an error :"+e);
    }   

所有特殊字符、所有空格和双引号都应删除并替换为所需的输出。

我正在使用 value.replaceAll("[^A-Za-z0-9 ]", "+") ,但它不起作用。

错误

 cash
 carry"

感谢任何帮助。正则表达式的新手。

【问题讨论】:

  • 什么不起作用?您当前的输出是什么?为什么会出错?
  • @Robin :例如“书店”仍然是“书店”,它不会改变。
  • 您是否将replaceAll 的结果重新分配给某个字符串引用?你需要知道字符串是不可变的,这意味着它们不能改变,所以像replace这样的方法不会影响原始字符串,而是创建它的新版本并返回它。
  • 另外,您如何期望"cash,carry",los+angeles+metro 变成cash+carry,los+angeles+metro?您刚刚决定将所有非字母数字字符和空格替换为空格,因此它将导致+cash+carry++los+angeles+metro
  • @Pshemo 就是这样,变成了+cash,carry逃到了下一行,因为逗号怎么处理,谢谢。

标签: java regex csv


【解决方案1】:

我认为您的正则表达式非常接近。为逗号添加一个例外,去掉空格,你就很好了。

BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = r.readLine()) != null)
{
    String replaced = line.replace("\"", "");
    replaced = replaced.replaceAll("[^A-Za-z0-9,]", "+");
    System.out.println(replaced);
}

当然,字符串在 Java 中是不可变的。记住这一点。 replaceAll() 返回一个新字符串,并且修改原始实例。

Demo here.

【讨论】:

  • 感谢您的回答,但接下来如何将“cash,carry”替换为 cash+carry。感谢您的帮助,由于逗号,它正在转义到下一行。
  • OP 将示例中的空格替换为 +。
  • 是的,我刚刚注意到。根据问题的正则表达式感到困惑。
  • 发布了代码供参考,也按照建议进行了更改,但是“cash,carry”抛出错误也发布了错误。
  • 测试过了,但它仍然将错误作为现金抛出,并将转义到下一行
【解决方案2】:

你需要:

  • 将引号内的所有逗号替换为 +
  • 替换非白名单(并且您需要在白名单中添加逗号) +
  • 删除双引号

试试这个:

line = line.replaceAll("[^A-Za-z0-9\",]|,(?!(([^\"]*\"){2})*[^\"]*$)", "+").replace("\"", "");

【讨论】:

  • @Braj 实际上似乎 OP 想要这样做,但前提是 , 在引号内。其余部分应保持不变。
  • 将建议测试为 String data = what[i].replace("\"", "").replaceAll("[^A-Za-z0-9 ,]", "+" ); 但不适用于书店
  • @user3188390 它不适用于书店,因为此答案包含replaceAll 中使用的正则表达式中的空格。但如果你删除它,你将得到与 Martijn`s 基本相同的答案。
  • 得到了与 Martijn 相同的答案,但“cash,carry”的问题仍然存在。感谢您的帮助和任何进一步的建议。
  • @user3188390 立即尝试
【解决方案3】:

您需要先找到引号并将其中的, 替换为+。接下来,您可以只使用replaceAll("[^A-Za-z0-9,]", "+"),这样您就可以将所有非字母数字字符或, 替换为+。您的代码可以使用

Pattern p = Pattern.compile("\"([^\"]*)\"");

pattern 来定位引用和来自 Matcher 类的 appendReplacementappendTail 以用其新版本替换已建立的引用。

所以简而言之,您的代码可能看起来像

Scanner scanner = new Scanner(new File(csvfile));

Pattern p = Pattern.compile("\"([^\"]*)\"");
StringBuffer sb = new StringBuffer();
while(scanner.hasNextLine()){
    String line = scanner.nextLine();
    Matcher m = p.matcher(line);
    while (m.find()){//find quotes
        //and replace their content with content with replaced `,` by `+`
        //BTW group(1) holds part of quotation without `"` marsk
        m.appendReplacement(sb, m.group(1).replace(',', '+'));
    }
    m.appendTail(sb);//we need to also add rest of unmatched data to buffer

    //now we can just normally replace special characters with +
    String result = sb.toString().replaceAll("[^A-Za-z0-9,]", "+");

    //after job is done we can use result, so lest print it
    System.out.println(result);

    //lets not forget to reset buffer for next line
    sb.delete(0, sb.length());
}

【讨论】:

  • 感谢您的帮助和努力,我已经测试了该建议并且效果很好,但是我在这里所做的是匹配标题,然后将每个标题下的数据存储为令牌和将其添加到数组列表中,那么我应该将结果写入另一个 CSV 文件并继续吗?
  • 我不确定你以后想用它做什么,所以做你认为正确的事情。我帮不了你(特别是因为我还没有机会与 CVS 合作,所以我的看法可能是错误的)。
  • 得到了答案,使用了@Bohemian 建议的代码并且它有效。发布答案以供将来参考。
【解决方案4】:

回答问题

String csvfile="BidAPI.csv"; 

try{

    // create the 'Array List'
    ArrayList<String> What=new ArrayList<String>();
    ArrayList<String> Where=new ArrayList<String>();

  BufferedReader br=new BufferedReader(new FileReader(csvfile));
    StringTokenizer st=null;
    String line="";
    int linenumber=0;
    int columnnumber;
    int free=0;
    int free1=0;    

    while((line=br.readLine())!=null){
         line =line.replaceAll("[^A-Za-z0-9\",]|,(?!(([^\"]*\"){2})*[^\"]*$)", "+").replace("\"", "");
        linenumber++;
        columnnumber=0;

        st=new StringTokenizer(line,",");
        while(st.hasMoreTokens()){
            columnnumber++;
            String token=st.nextToken();
            if("What".equals(token)){
                free=columnnumber;
                System.out.println("the value of free  :"+free);
                } else if("Where".equals(token)){
                free1=columnnumber;
                System.out.println("the value of free1 :"+free1);
                } 

                if(linenumber>1){

            if (columnnumber==free){
                What.add(token);    
            } else if(columnnumber==free1){
                Where.add(token);
            }
        }
    }
}


// converting the  'What' Array List to array
String[] what=What.toArray(new String[What.size()]);

// converting the 'Where' Array List to array
String[] where = Where.toArray(new String[Where.size()]);

for(int i=0;i<what.length;i++){
String data = what[i].replaceAll("[^A-Za-z0-9\",]| (?!([^\"]*\"){2}[^\"]*$)", "+").replace("\"", "");
System.out.println(data);
System.out.println(where[i]);
String finaldata = data+where[i];
String json = readUrl(desturl);
br.close();
}catch(Exception e){
    System.out.println("There is an error :"+e);
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2012-11-06
    • 1970-01-01
    • 2021-12-30
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多