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

我要做的是读一本。Java 文件,并挑选出所有的标识符,并将它们存储在一个列表中。我的问题是。Split ()方法。如果按原样运行此代码,将得到 ArrayOutOfBound,但如果将分隔符从“”更改为“”对其他任何东西,代码工作。但是我需要通过“”来解析行还有别的办法吗?

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;




public class MyHash {
private static String[] reserved = new String[100];
private static List list = new LinkedList();
private static List list2 = new LinkedList();


public static void main (String args[]){
Hashtable hashtable  = new Hashtable(997);
makeReserved();
readFile();
String line;
ListIterator itr = list.listIterator();
int listIndex = 0;
while (listIndex < list.size()) {


if (itr.hasNext()){
line = itr.next().toString();
//PROBLEM IS HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
String[] words = line.split(".");  //CHANGE THIS AND IT WILL WORK
System.out.println(words[0]);      //TESTING TO SEE IF IT WORKED
}
listIndex++;
}
}


public static void readFile() {
String text;
String[] words;
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader("MyHash.java")); //NAME OF INPUT FILE




} catch (FileNotFoundException ex) {
Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE, null, ex);
}
try {
while ((text = in.readLine()) != null){
text = text.trim();
words = text.split("\\s+");
for (int i = 0; i < words.length; i++){
list.add(words[i]);
}
for (int j = 0; j < reserved.length; j++){
if (list.contains(reserved[j])){
list.remove(reserved[j]);
}
}




}


} catch (IOException ex) {
Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE, null, ex);
}
try {
in.close();
} catch (IOException ex) {
Logger.getLogger(MyHash.class.getName()).log(Level.SEVERE, null, ex);
}
}


public static int keyIt (int x) {
int key = x % 997;
return key;
}


public static int horner (String word){
int length = word.length();
char[] letters = new char[length];


for (int i = 0; i < length; i++){
letters[i]=word.charAt(i);
}


char[] alphabet = new char[26];
String abc = "abcdefghijklmnopqrstuvwxyz";


for (int i = 0; i < 26; i++){
alphabet[i]=abc.charAt(i);
}


int[] numbers = new int[length];
int place = 0;
for (int i = 0; i < length; i++){
for (int j = 0; j < 26; j++){
if (alphabet[j]==letters[i]){
numbers[place]=j+1;
place++;


}
}
}


int hornered = numbers[0] * 32;


for (int i = 1; i < numbers.length; i++){


hornered += numbers[i];
if (i == numbers.length -1){
return hornered;
}
hornered = hornered % 997;
hornered *= 32;
}
return hornered;
}


public static String[] makeReserved (){
reserved[0] = "abstract";
reserved[1] = "assert";
reserved[2] = "boolean";
reserved[3] = "break";
reserved[4] = "byte";
reserved[5] = "case";
reserved[6] = "catch";
reserved[7] = "char";
reserved[8] = "class";
reserved[9] = "const";
reserved[10] = "continue";
reserved[11] = "default";
reserved[12] = "do";
reserved[13] = "double";
reserved[14] = "else";
reserved[15] = "enum";
reserved[16] = "extends";
reserved[17] = "false";
reserved[18] = "final";
reserved[19] = "finally";
reserved[20] = "float";
reserved[21] = "for";
reserved[22] = "goto";
reserved[23] = "if";
reserved[24] = "implements";
reserved[25] = "import";
reserved[26] = "instanceof";
reserved[27] = "int";
reserved[28] = "interface";
reserved[29] = "long";
reserved[30] = "native";
reserved[31] = "new";
reserved[32] = "null";
reserved[33] = "package";
reserved[34] = "private";
reserved[35] = "protected";
reserved[36] = "public";
reserved[37] = "return";
reserved[38] = "short";
reserved[39] = "static";
reserved[40] = "strictfp";
reserved[41] = "super";
reserved[42] = "switch";
reserved[43] = "synchronize";
reserved[44] = "this";
reserved[45] = "throw";
reserved[46] = "throws";
reserved[47] = "trasient";
reserved[48] = "true";
reserved[49] = "try";
reserved[50] = "void";
reserved[51] = "volatile";
reserved[52] = "while";
reserved[53] = "=";
reserved[54] = "==";
reserved[55] = "!=";
reserved[56] = "+";
reserved[57] = "-";
reserved[58] = "*";
reserved[59] = "/";
reserved[60] = "{";
reserved[61] = "}";


return reserved;
}
}
133244 次浏览

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

你(可能)想要这样的东西:

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

Some folks seem to be having trouble getting this to work, so here is some runnable code you can use to verify correct behaviour.

import java.util.Arrays;


public class TestSplit {
public static void main(String[] args) {
String line = "aa.bb.cc.dd";
String[] words = line.split("\\.");
System.out.println(Arrays.toString(words));
// Output is "[aa, bb, cc, dd]"
}
}

要拆分的参数是一个正则表达式。“ .”匹配任何内容,所以要拆分的分隔符是任何内容。

你有没有试过逃避这个点? 像这样:

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

要拆分的参数是正则表达式。句点是匹配任何内容的正则表达式元字符,因此 line中的每个字符都被认为是拆分字符,并被丢弃,它们之间的所有空字符串都被丢弃(因为它们是空字符串)。结果就是你一无所有。

如果您转义句点(通过在它之前添加一个转义反斜杠) ,那么您可以匹配文字句点

您可能对 StringTokenizer类感兴趣。但是,java 文档建议您使用。拆分方法,因为 StringTokenizer 是遗留类。

如果性能有问题,应该考虑使用 StringTokenizer而不是 splitStringTokenizersplit快得多,尽管它是一个“遗留”类(但不是不推荐的)。

当使用字符串文字分隔符进行分隔时,最安全的方法是使用 模式,引用()方法:

String[] words = line.split(Pattern.quote("."));

正如其他答案所描述的那样,使用 "\\."进行分割是正确的,但是 quote()将为您实现这种转义。

This is 绝对没有 the best way to do this but, I got it done by doing something like following.

String imageName = "my_image.png";
String replace = imageName.replace('.','~');
String[] split = replace.split("~");


System.out.println("Image name : " + split[0]);
System.out.println("Image extension : " + split[1]);

输出,

Image name : my_image
Image extension : png