在java[duplicate]中,如何使用“.”作为String.split()的分隔符

这个问题在这里已经有答案了
Java字符串拆分为带&quot&引用;(点)[重复]

(4个答案)

三年前关闭的

我试图做的是读取一个.java文件,然后挑出所有标识符并将它们存储在一个列表中。我的问题是.split()方法。如果按原样运行此代码,您将获得ArrayOutOfBounds,但如果您将分隔符从“.”更改为其他任何字符,代码将正常工作。但是我需要用“.”来解析行,那么有没有其他方法可以实现这一点呢

导入java.io.BufferedReader;
导入java.io.FileNotFoundException;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.*;
公共类MyHash{
私有静态字符串[]保留=新字符串[100];
私有静态列表=新建LinkedList();
private static List list2=new LinkedList();
公共静态void main(字符串参数[]){
Hashtable Hashtable=新的Hashtable(997);
makeReserved();
readFile();
弦线;
ListIterator itr=list.ListIterator();
int listIndex=0;
while(listIndex<list.size()){
if(itr.hasNext()){
line=itr.next().toString();
//问题就在这里!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
String[]words=line.split(“.”;//更改此项,它就会工作
System.out.println(words[0]);//测试是否有效
}
listIndex++;
}
}
公共静态void readFile(){
字符串文本;
字符串[]个单词;
BufferedReader in=null;
试一试{
in=new BufferedReader(new FileReader(“MyHash.java”);//输入文件的名称
}捕获(FileNotFoundException ex){
Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE,null,ex);
}
试一试{
而((text=in.readLine())!=null){
text=text.trim();
文字=文本。拆分(\\s+);
for(int i=0;i<words.length;i++){
增加(字[i]);
}
对于(int j=0;j<reserved.length;j++){
if(列表包含(保留[j])){
列表。删除(保留[j]);
}
}
}
}捕获(IOEX异常){
Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE,null,ex);
}
试一试{
in.close();
}捕获(IOEX异常){
Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE,null,ex);
}
}
公共静态int-keyIt(int x){
int key=x%997;
返回键;
}
公共静态int horner(字符串字){
int length=word.length();
字符[]字母=新字符[长度];
对于(int i=0;i<length;i++){
字母[i]=单词字符(i);
}
字符[]字母表=新字符[26];
字符串abc=“abcdefghijklmnopqrstuvxyz”;
对于(int i=0;i<26;i++){
字母表[i]=abc.charAt(i);
}
int[]数字=新的int[长度];
int place=0;
对于(int i=0;i<length;i++){
对于(int j=0;j<26;j++){
如果(字母[j]==字母[i]){
编号[位置]=j+1;
place++;
}
}
}
int=number[0]*32;
对于(int i=1;i<number.length;i++){
霍内德+=数字[i];
if(i==numbers.length-1){
返回角;
}
hornered=hornered%997;
霍内德*=32;
}
返回角;
}
公共静态字符串[]makeReserved(){
保留[0]=“摘要”;
保留[1]=“断言”;
保留[2]=“布尔”;
保留[3]=“中断”;
保留[4]=“字节”;
保留[5]=“案例”;
保留[6]=“捕获”;
保留[7]=“char”;
保留[8]=“类”;
保留[9]=“常量”;
保留[10]=“继续”;
保留[11]=“默认”;
保留[12]=“do”;
保留[13]=“双精度”;
保留[14]=“其他”;
保留[15]=“枚举”;
保留[16]=“扩展”;
保留[17]=“假”;
保留[18]=“最终”;
保留[19]=“最终”;
保留[20]=“浮动”;
保留[21]=“用于”;
保留[22]=“转到”;
保留[23]=“如果”;
保留[24]=“实现”;
保留[25]=“导入”;
保留[26]=“instanceof”;
保留[27]=“int”;
预留[28]=“接口”;
保留[29]=“长”;
保留[30]=“本机”;
保留[31]=“新建”;
保留[32]=“空”;
保留[33]=“包”;
保留[34]=“专用”;
保留[35]=“受保护”;
保留[36]=“公共”;
保留[37]=“返回”;
保留[38]=“短”;
保留[39]=“静态”;
保留[40]=“strictfp”;
保留[41]=“超级”;
保留[42]=“开关”;
保留[43]=“同步”;
保留[44]=“此”;
保留[45]=“投掷”;
保留[46]=“抛出”;
保留[47]=“trasient”;
保留[48]=“真”;
保留[49]=“尝试”;
保留[50]=“作废”;
保留[51]=“易失性”;
保留[52]=“while”;
保留[53]=“=”;
保留[54]=“=”;
保留[55]=“!=”;
保留[56]=“+”;
保留[57]=“-”;
保留[58]=“*”;
保留[59]=“/”;
保留[60]=“{”;
保留[61]=“}”;
保留返回;
}
}

String.split接受正则表达式,“.”对正则表达式有特殊含义

您(可能)想要的是:

String[]words=line.split(“\\”);

有些人似乎很难做到这一点,所以这里有一些可运行的代码可以用来验证正确的行为

导入java.util.array;
公共类TestSplit{
公共静态void main(字符串[]args){
字符串line=“aa.bb.cc.dd”;
String[]words=line.split(“\\”);
System.out.println(array.toString(words));
//输出为“[aa、bb、cc、dd]”
}
}

发表评论