"."는 어떻게 사용합니까? Java [duplicate]에서 String.split ()을 사용하여 구분 기호로 사용
이 질문에 이미 답변이 있습니다.
- "."로 분할 된 Java 문자열 (점) [중복] 4 개의 답변
내가하려는 것은 .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;
}
}
String.split
정규식을 취하고 '.' 정규 표현식에는 특별한 의미가 있습니다.
당신은 (아마도) 다음과 같은 것을 원합니다.
String[] words = line.split("\\.");
일부 사람들은이 작업을 수행하는 데 문제가있는 것 같으므로 여기에 올바른 동작을 확인하는 데 사용할 수있는 실행 가능한 코드가 있습니다.
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]"
}
}
When splitting with a string literal delimiter, the safest way is to use the Pattern.quote() method:
String[] words = line.split(Pattern.quote("."));
As described by other answers, splitting with "\\."
is correct, but quote()
will do this escaping for you.
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.
If you escape the period (by adding an escaped backslash before it), then you can match literal periods. (line.split("\\.")
)
Have you tried escaping the dot? like this:
String[] words = line.split("\\.");
The argument to split is a regular expression. "." matches anything so your delimiter to split on is anything.
This is definitely not 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]);
Output,
Image name : my_image
Image extension : png
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).
You might be interested in the StringTokenizer class. However, the java docs advise that you use the .split method as StringTokenizer is a legacy class.
참고URL : https://stackoverflow.com/questions/2755945/how-can-i-use-as-the-delimiter-with-string-split-in-java
'developer tip' 카테고리의 다른 글
프로그래밍 방식으로 탐색 모음에 단추 추가 (0) | 2020.09.13 |
---|---|
왜 printf ( "% f", 0); (0) | 2020.09.13 |
문자열에서 n 번째 문자를 찾는 방법은 무엇입니까? (0) | 2020.09.13 |
/ etc / nginx를 어떻게 복원 할 수 있습니까? (0) | 2020.09.13 |
Mocha API 테스트 : 'TypeError : app.address is not a function'발생 (0) | 2020.09.13 |