Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中用另一个字符替换所有特殊字符?_Java_Regex_Csv - Fatal编程技术网

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

如何在java中用另一个字符替换所有特殊字符?,java,regex,csv,Java,Regex,Csv,我想用java中的特殊字符替换所有的“特殊字符” 例如,“现金+套利”将变为“现金+套利”,而“现金$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+

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

例如,“现金+套利”将变为“现金+套利”,而“现金$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);
    }   

感谢您的帮助。不熟悉正则表达式。

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

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


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

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

您需要:

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

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

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

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

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

Pattern p = Pattern.compile("\"([^\"]*)\"");
模式来定位Matcher类中的引号和
appendReplacement
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());
}

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

Pattern p = Pattern.compile("\"([^\"]*)\"");
模式来定位Matcher类中的引号和
appendReplacement
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());
}

问题的答案

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);
}   
String csvfile=“BidAPI.csv”;
试一试{
//创建“数组列表”
ArrayList What=新的ArrayList();
ArrayList,其中=新的ArrayList();
BufferedReader br=新的BufferedReader(新文件读取器(csvfile));
StringTokenizer st=null;
字符串行=”;
int linenumber=0;
int列数;
int-free=0;
int free1=0;
而((line=br.readLine())!=null){
line=line.replaceAll(“[^A-Za-z0-9\”,]|,(?!(([^\“]*\”){2})*[^\“]*$”,“+”。替换(“\”,”);
linenumber++;
列数=0;
st=新的StringTokenizer(行“,”);
而(st.hasMoreTokens()){
columnnumber++;
字符串标记=st.nextToken();
如果(“What.”等于(令牌)){
自由=列数;
System.out.println(“自由值:+free”);
}else if(“Where.”等于(标记)){
free1=列数;
System.out.println(“free1的值:+free1”);
} 
如果(行号>1){
如果(columnnumber==自由){
添加(令牌);
}else if(columnnumber==free1){
其中。添加(令牌);
}
}
}
}
//将“What”数组列表转换为数组
String[]what=what.toArray(新字符串[what.size()]);
//将“Where”数组列表转换为数组
字符串[]其中=where.toArray(新字符串[where.size()]);

对于(inti=0;i问题的答案

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);
}   
String csvfile=“BidAPI.csv”;
试一试{
//创建“数组列表”
ArrayList What=新的ArrayList();
ArrayList,其中=新的ArrayList();
BufferedReader br=新的BufferedReader(新文件读取器(csvfile));
StringTokenizer st=null;
字符串行=”;
int linenumber=0;
int列数;
int-free=0;
int free1=0;
而((line=br.readLine())!=null){
line=line.replaceAll(“[^A-Za-z0-9\”,]|,(?!(([^\“]*\”){2})*[^\“]*$”,“+”。替换(“\”,”);
linenumber++;
列数=0;
st=新的StringTokenizer(行“,”);
而(st.hasMoreTokens()){
columnnumber++;
字符串标记=st.nextToken();
如果(“What.”等于(令牌)){
自由=列数;
System.out.println(“自由值:+free”);
}else if(“Where.”等于(标记)){
free1=列数;
System.out.println(“free1的值:+free1”);
} 
如果(行号>1){
如果(columnnumber==自由){
添加(令牌);
}else if(columnnumber==free1){
其中。添加(令牌);
}
}
}
}
//将“What”数组列表转换为数组
String[]what=what.toArray(新字符串[what.size()]);
//将“Where”数组列表转换为数组
字符串[]其中=where.toArray(新字符串[where.size()]);

对于(int i=0;i什么不起作用?您当前的输出是什么?为什么错误?@Robin:例如,“book store”仍然是“book store”,并且没有更改。您是否将replaceAll的结果重新分配给某个字符串引用?您需要知道字符串是不可变的,这意味着它们不能更改,所以像
replace
这样的方法不会受到影响重新输入原始字符串,但创建新版本的字符串并将其返回。另外,您希望洛杉矶+洛杉矶+地铁
如何变成洛杉矶+洛杉矶+地铁
?您刚刚决定将所有非字母数字字符和空格替换为空格,以便