我如何使用“。” 作为 java 中 String.split() 的分隔符
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2755945/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I use "." as the delimiter with String.split() in java
提问by Matt
What I am trying to do is read a .java file, and pick out all of the identifiers and store them in a list. My problem is with the .split() method. If you run this code the way it is, you will get ArrayOutOfBounds, but if you change the delimiter from "." to anything else, the code works. But I need to lines parsed by "." so is there another way I could accomplish this?
我想要做的是读取一个 .java 文件,然后挑选出所有的标识符并将它们存储在一个列表中。我的问题是 .split() 方法。如果您按原样运行此代码,您将获得 ArrayOutOfBounds,但如果您将分隔符从“.”更改为“.”。对于其他任何事情,代码都有效。但我需要用“.”解析的行。那么还有另一种方法可以做到这一点吗?
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;
}
}
回答by clstrfsck
String.split
takes a regex, and '.' has a special meaning for regexes.
String.split
需要一个正则表达式,和 '.' 对正则表达式有特殊意义。
You (probably) want something like:
你(可能)想要这样的东西:
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]"
}
}
回答by Rob Goodwin
The argument to split is a regular expression. "." matches anything so your delimiter to split on is anything.
split 的参数是一个正则表达式。“。” 匹配任何内容,因此您要拆分的分隔符是任何内容。
回答by MexicanHacker
Have you tried escaping the dot? like this:
你有没有试过逃避点?像这样:
String[] words = line.split("\\.");
String[] words = line.split("\\.");
回答by Ken Bloom
The argument to split is a regular expression. The period is a regular expression metacharacter that matches anything, thus every character in line
is considered to be a split character, and is thrown away, and all of the empty strings between them are thrown away (because they're empty strings). The result is that you have nothing left.
split 的参数是一个正则表达式。句号是一个正则表达式元字符,可以匹配任何东西,因此每个字符都line
被认为是一个拆分字符,并被丢弃,并且它们之间的所有空字符串都被丢弃(因为它们是空字符串)。结果是你一无所有。
If you escape the period (by adding an escaped backslash before it), then you can match literal periods. (line.split("\\.")
)
如果您转义句点(通过在它之前添加转义反斜杠),那么您可以匹配文字句点。( line.split("\\.")
)
回答by Nitrodist
You might be interested in the StringTokenizerclass. However, the java docs advise that you use the .split method as StringTokenizer is a legacy class.
您可能对StringTokenizer类感兴趣。但是,java 文档建议您使用 .split 方法,因为 StringTokenizer 是一个遗留类。
回答by Lars Andren
If performance is an issue, you should consider using StringTokenizer
instead of split
. StringTokenizer
is much much faster than split
, even though it is a "legacy" class (but not deprecated).
如果性能是一个问题,您应该考虑使用StringTokenizer
而不是split
. StringTokenizer
比 快得多split
,即使它是一个“遗留”类(但不推荐使用)。
回答by prunge
When splitting with a string literal delimiter, the safest way is to use the Pattern.quote()method:
使用字符串文字定界符进行拆分时,最安全的方法是使用Pattern.quote()方法:
String[] words = line.split(Pattern.quote("."));
As described by other answers, splitting with "\\."
is correct, but quote()
will do this escaping for you.
正如其他答案所描述的那样,拆分 with"\\."
是正确的,但quote()
会为您解决这个问题。
回答by CLOUGH
This is definitely notthe 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]);
Output,
输出,
Image name : my_image
Image extension : png