점을 구분 기호로 사용하여 문자열 분할


99

.올바른 방법으로 문자열을 분할 할 것인지 궁금합니다 . 내 코드는 다음과 같습니다.

String[] fn = filename.split(".");
return fn[0];

문자열의 첫 부분 만 필요하므로 첫 번째 항목을 반환합니다. 나는 API에서 .어떤 캐릭터 를 의미 하는 것을 알았 기 때문에 묻기 때문에 이제 막혔습니다.

답변:


173

split()정규식을 허용하므로 .정규식 메타 문자로 간주하지 않으 려면 이스케이프해야합니다 . 다음은 예입니다.

String[] fn = filename.split("\\."); 
return fn[0];

17

Split은 정규식을 사용합니다. 여기서 '.' 무엇이든 의미하는 특수 문자입니다. 실제로 '.'와 일치하도록하려면 이스케이프해야합니다. 캐릭터:

String[] fn = filename.split("\\.");

(하나는 정규식에서 '.'을 이스케이프하고 다른 하나는 Java 문자열에서 첫 번째 것을 이스케이프하는 '\')

또한 something.blabla.txt유효한 이름 인 이라는 파일이 있으면 실제 파일 이름을 반환하지 않기 때문에 fn [0] 반환을 제안 하지 않습니다. 대신 다음을 사용하는 것이 더 낫다고 생각합니다.

int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);

질문에는 Javascript가 아니라 Java로 태그가 지정되어 있습니다.
Andrei Fierbinteanu 2013

17

여기에 해결책 만 표시되지만 문제에 대한 완전한 설명이 없으므로이 답변을 게시하기로 결정했습니다.

문제

에 대해 알아야 할 사항이 거의 없습니다 text.split(delim). split방법:

  1. 분할하려는 구분 기호를 설명하는 인수 정규식 (regex) 으로 허용합니다 .
  2. like의 delim끝에 존재 한다면 (구분자가있는 경우 ) 처음에는 다음과 같은 배열을 생성 하지만 대부분의 경우 이러한 후행 빈 문자열이 실제로 필요하지 않기 때문에 자동으로 제거됩니다. 따라서이 후행 빈 문자열없이 또 다른 배열을 만들고 반환합니다 .texta,b,c,,,split["a" "b" "c" "" ""]

당신은 또한 알아야 할 점이. 있다 특수 문자 에서 정규 표현식 . 모든 문자를 나타냅니다 (줄 구분 기호는 제외하지만 Pattern.DOTALL플래그 로 변경할 수 있음 ).

그래서 "abc"우리가 "." split메소드로 분할하면 문자열에 대해

  1. 와 같은 배열 만들기 ["" "" "" ""],
  2. 그러나이 배열에는 빈 문자열 만 포함되어 있고 모두 후행이므로 제거됩니다 (이전 두 번째 지점에 표시된 것처럼)

즉, 결과로 빈 배열 [](요소 없음, 빈 문자열도 없음) 을 얻게 되므로 fn[0]인덱스 0이 없기 때문에 사용할 수 없습니다 .

해결책

이 문제를 해결하려면 점을 나타내는 정규식을 생성하기 만하면됩니다. 그렇게하려면 우리는 그것을 피해야합니다 .. 이를 수행하는 방법은 거의 없지만 가장 간단한 방법은 아마도 사용 \하는 것입니다 (String에서 작성해야하는 "\\"이유 \는 특수하고 다른 \것을 이스케이프 해야 하기 때문 입니다 ).

따라서 문제에 대한 해결책은 다음과 같습니다.

String[] fn = filename.split("\\.");

보너스

다른 방법을 사용하여 다음과 같이 해당 점을 이스케이프 할 수도 있습니다.

  • 캐릭터 클래스 사용 split("[.]")
  • 따옴표로 감싸 split("\\Q.\\E")
  • Pattern.LITERAL플래그 와 함께 적절한 패턴 인스턴스 사용
  • 또는 단순히 사용 split(Pattern.quote("."))하고 regex가 당신을 위해 이스케이프하도록하십시오.

this .. 나는 정말 좋아 : split("[.]")
Dragonborn

15

String # split (String) 메서드는 정규식을 사용합니다. 정규식에서 "." 문자는 "모든 문자"를 의미합니다. "."를 이스케이프하여이 동작을 피할 수 있습니다.

filename.split("\\.");

또는 split 메소드에게 문자 클래스에서 분할하도록 지시합니다.

filename.split("[.]");

문자 클래스는 문자 모음입니다. 당신은 쓸 수 있습니다

filename.split("[-.;ld7]");

파일 이름은 "-", ".", ";", "l", "d"또는 "7"마다 분할됩니다. 문자 클래스 내에서 "." 특수 문자 ( "메타 문자")가 아닙니다.


@MisterSmith 여기에서 프로그래밍 언어를 살펴볼 수 있습니다. 우리는 자바 스크립트가 아니라 자바에 대해 이야기하고 있습니다.
f1sh 2013

너가 확실히 맞아. 나는 어제 피곤했고 두 언어로 코딩하면서 Java 데이터 유형을 인식하지 못했습니다. 나는 아마도 2010 년에 대답이 정확하다고 생각했지만 오늘날의 브라우저는 다른 방식으로 작동했습니다.
미스터 스미스

7

DOT (.)는 특수 문자로 간주되고 String의 split 메소드는 정규식을 예상하므로 다음과 같이해야합니다.

String[] fn = filename.split("\\.");
return fn[0];

Java에서는 특수 문자를 "\"로 이스케이프해야하지만 "\"도 Java에서 특수 문자이므로 다른 "\"로 다시 이스케이프해야합니다!



2

사용하는 것이 더 효율적이지 않을까요?

 filename.substring(0, filename.indexOf("."))

첫 번째 점까지만 원하는 경우?


2

일반적으로 손으로 가면을 벗기는 것은 좋지 않습니다. 이 작업을위한 Pattern 클래스에는 다음과 같은 메서드가 있습니다.

java.util.regex
static String quote(String s) 


0

참고 :이 스 니펫은 점이 이스케이프 된 후에도주의해야합니다.

filename이 문자열 "."이면 fn은 여전히 ​​길이가 0이되고 fn [0]은 여전히 ​​예외를 발생시킵니다!

이는 패턴이 적어도 한 번 일치하면 split은 배열에서 모든 후행 빈 문자열 (즉 , 점 문자열 도 !)을 버리고 빈 배열을 반환하기 때문입니다.


당면한 것과 같은 경우에 가장 쉬운 해결책은 split 호출에 2의 한계 인수를 전달하는 것입니다. String [] fn = filename.split ( "[.]", 2);
avl42


0

ApacheCommons를 사용 하는 것은 가장 간단합니다.

File file = ...
FilenameUtils.getBaseName(file.getName());

또한 전체 경로에서 파일 이름을 추출합니다.


-2

split정규식을 인수로 사용합니다. 따라서 정규식의 메타 문자 이기 때문에 "\."대신 전달해야합니다 .".""."

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.