답변:
split()정규식을 허용하므로 .정규식 메타 문자로 간주하지 않으 려면 이스케이프해야합니다 . 다음은 예입니다.
String[] fn = filename.split("\\.");
return fn[0];
Split은 정규식을 사용합니다. 여기서 '.' 무엇이든 의미하는 특수 문자입니다. 실제로 '.'와 일치하도록하려면 이스케이프해야합니다. 캐릭터:
String[] fn = filename.split("\\.");
(하나는 정규식에서 '.'을 이스케이프하고 다른 하나는 Java 문자열에서 첫 번째 것을 이스케이프하는 '\')
또한 something.blabla.txt유효한 이름 인 이라는 파일이 있으면 실제 파일 이름을 반환하지 않기 때문에 fn [0] 반환을 제안 하지 않습니다. 대신 다음을 사용하는 것이 더 낫다고 생각합니다.
int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);
여기에 해결책 만 표시되지만 문제에 대한 완전한 설명이 없으므로이 답변을 게시하기로 결정했습니다.
에 대해 알아야 할 사항이 거의 없습니다 text.split(delim). split방법:
delim끝에 존재 한다면 (구분자가있는 경우 ) 처음에는 다음과 같은 배열을 생성 하지만 대부분의 경우 이러한 후행 빈 문자열이 실제로 필요하지 않기 때문에 자동으로 제거됩니다. 따라서이 후행 빈 문자열없이 또 다른 배열을 만들고 반환합니다 .texta,b,c,,,split["a" "b" "c" "" ""]당신은 또한 알아야 할 점이. 있다 특수 문자 에서 정규 표현식 . 모든 문자를 나타냅니다 (줄 구분 기호는 제외하지만 Pattern.DOTALL플래그 로 변경할 수 있음 ).
그래서 "abc"우리가 "." split메소드로 분할하면 문자열에 대해
["" "" "" ""],즉, 결과로 빈 배열 [](요소 없음, 빈 문자열도 없음) 을 얻게 되므로 fn[0]인덱스 0이 없기 때문에 사용할 수 없습니다 .
이 문제를 해결하려면 점을 나타내는 정규식을 생성하기 만하면됩니다. 그렇게하려면 우리는 그것을 피해야합니다 .. 이를 수행하는 방법은 거의 없지만 가장 간단한 방법은 아마도 사용 \하는 것입니다 (String에서 작성해야하는 "\\"이유 \는 특수하고 다른 \것을 이스케이프 해야 하기 때문 입니다 ).
따라서 문제에 대한 해결책은 다음과 같습니다.
String[] fn = filename.split("\\.");
보너스
다른 방법을 사용하여 다음과 같이 해당 점을 이스케이프 할 수도 있습니다.
split("[.]")split("\\Q.\\E")Pattern.LITERAL플래그 와 함께 적절한 패턴 인스턴스 사용split(Pattern.quote("."))하고 regex가 당신을 위해 이스케이프하도록하십시오.split("[.]")
String # split (String) 메서드는 정규식을 사용합니다. 정규식에서 "." 문자는 "모든 문자"를 의미합니다. "."를 이스케이프하여이 동작을 피할 수 있습니다.
filename.split("\\.");
또는 split 메소드에게 문자 클래스에서 분할하도록 지시합니다.
filename.split("[.]");
문자 클래스는 문자 모음입니다. 당신은 쓸 수 있습니다
filename.split("[-.;ld7]");
파일 이름은 "-", ".", ";", "l", "d"또는 "7"마다 분할됩니다. 문자 클래스 내에서 "." 특수 문자 ( "메타 문자")가 아닙니다.
String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));
일반적으로 손으로 가면을 벗기는 것은 좋지 않습니다. 이 작업을위한 Pattern 클래스에는 다음과 같은 메서드가 있습니다.
java.util.regex
static String quote(String s)
참고 :이 스 니펫은 점이 이스케이프 된 후에도주의해야합니다.
filename이 문자열 "."이면 fn은 여전히 길이가 0이되고 fn [0]은 여전히 예외를 발생시킵니다!
이는 패턴이 적어도 한 번 일치하면 split은 배열에서 모든 후행 빈 문자열 (즉 , 점 앞 의 문자열 도 !)을 버리고 빈 배열을 반환하기 때문입니다.