답변:
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
끝에 존재 한다면 (구분자가있는 경우 ) 처음에는 다음과 같은 배열을 생성 하지만 대부분의 경우 이러한 후행 빈 문자열이 실제로 필요하지 않기 때문에 자동으로 제거됩니다. 따라서이 후행 빈 문자열없이 또 다른 배열을 만들고 반환합니다 .text
a,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은 배열에서 모든 후행 빈 문자열 (즉 , 점 앞 의 문자열 도 !)을 버리고 빈 배열을 반환하기 때문입니다.