当前位置: 首页 > 知识库问答 >
问题:

如何在java中用另一个字符替换所有特殊字符?

颜华池
2023-03-14

我想在java中将所有“特殊字符”替换为特殊字符

例如“现金”

我有一个示例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);
    }   

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

我使用的是值。replaceAll(“[^A-Za-z0-9]”,“”),但它不工作。

错误

 cash
 carry"

感谢您的帮助。regex的新成员。

共有3个答案

闽经纬
2023-03-14

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

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

模式来定位引用和Matcher类中的append替换appendTail以用其新版本替换已建立的引用。

简而言之,你的代码看起来像

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());
}
梁盛
2023-03-14

我觉得你的正则表达式很接近。也为逗号添加一个例外,去掉空格,就可以了。

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()返回一个新的字符串,并且不修改原始实例。

演示在这里。

浦琪
2023-03-14

您需要:

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

试试这个:

line = line.replaceAll("[^A-Za-z0-9\",]|,(?!(([^\"]*\"){2})*[^\"]*$)", "+").replace("\"", "");
 类似资料:
  • 我有一个包含以下列的表: 然后,我手动将更新sql编写为 现在,这个解决方案对我来说并不现实。我查看了以下与Regex相关的链接和它周围的其他链接。 更新和替换字符串的一部分 https://www.codeproject.com/questions/456246/replace-special-characters-in-sql 我如何编写能够处理所有这些特殊字符的更新sql?

  • 问题内容: 这将所有特殊字符替换为“”(空格)。 但是我尝试将破折号“-”排除为特殊字符。 这是我的尝试: 但这不是我期望的。 问 :如何进行这项工作? 问题答案: 如果要匹配除以外的所有字符,可以使用: 例如:

  • 问题内容: 我该如何更换: “ã”和“ a” “é”和“ e” 在PHP中?这可能吗?我读过某处我可以使用基本字符的ascii值和重音符号的ascii值进行一些数学运算,但是现在找不到任何参考。 问题答案: 这个答案是不正确的。 编写它时,我不理解Unicode规范化。查看francadaval的评论和链接 签出Normalizer类来执行此操作。文档很好,所以我将其链接起来,而不是在这里重复:

  • 我有下一个字符串: 我想替换所有出现的,问题是当有特殊字符(例如: 可以由任何< code >字符串替换。 有什么办法可以解决这个问题吗?

  • 有没有办法用gsub替换R中的特殊字符串?我有几列里面有,我想把它改为,但是gsub不起作用 下面是一个例子: 我收到以下输出:

  • 问题内容: 我想删除的特殊字符,如多次出现,,,从我的java字符串由单下划线。我试过了 并且似乎用下划线替换了连续的相同类型的特殊字符,但否则不起作用。例如: 变成 (下划线有2个。)但是应该是。 同样对于失败的情况。我也尝试使用regex并做了一个正则表达式 但这仍然无济于事。我该如何实现? 问题答案: 注意,这是对与第一个捕获组匹配的 内容 的反向引用。要实际匹配字符类中的一个或多个任何字符