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

我想要做的是读取一个.java文件,并挑出所有的标识符,并将它们存储在一个列表中。 我的问题是与.split()方法。 如果按照这种方式运行此代码,则将获得ArrayOutOfBounds,但是如果将分隔符从“。”更改。 到其他任何东西,代码的作品。 但是我需要用“。”parsing的行。 那么还有另外一种方法可以做到这一点?

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; } } 

String.split采用正则expression式,'。' 对正则expression式有特殊的意义。

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

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

有些人似乎无法得到这个工作,所以这里有一些可运行的代码,你可以用来validation正确的行为。

 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分隔符分割时,最安全的方法是使用Pattern.quote()方法:

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

如其他答案所述,用"\\."分割"\\." 是正确的,但是quote()会为你逃脱。

分裂的论据是一个正则expression式。 这个句点是一个正则expression式元字符,它匹配任何东西,因此每一line字符都被认为是一个分割字符,并被抛弃,它们之间的所有空string都被抛出(因为它们是空string)。 结果是你什么都没有了。

如果你逃脱了这段时间(通过在它之前加一个反斜杠),那么你可以匹配文本句点。 ( line.split("\\.")

你试过逃脱点吗? 喜欢这个:

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

分裂的论据是一个正则expression式。 “” 匹配任何东西,所以你的分隔符是什么。

如果性能是一个问题,你应该考虑使用StringTokenizer而不是splitStringTokenizersplit快得多,尽pipe它是一个“遗留”类(但不被弃用)。

绝对不是做这件事的最好方法,但是我通过做下面的事情来完成它。

 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 

您可能对StringTokenizer类感兴趣。 但是,java文档build议您使用.split方法,因为StringTokenizer是一个遗留类。