如何在java中用另一个字符替换所有特殊字符?
我想用java中的特殊字符替换所有的“特殊字符” 例如,“现金+套利”将变为“现金+套利”,而“现金$carry”也将变为“现金+套利” 我有一个示例CSV文件 此处的CSV标题为“What”和“Where”如何在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+
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
这样的方法不会受到影响重新输入原始字符串,但创建新版本的字符串并将其返回。另外,您希望洛杉矶+洛杉矶+地铁如何变成洛杉矶+洛杉矶+地铁
?您刚刚决定将所有非字母数字字符和空格替换为空格,以便