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

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

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

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



답변

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방법:

  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가 당신을 위해 이스케이프하도록하십시오.

답변

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

filename.split("\\.");

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

filename.split("[.]");

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

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

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


답변

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

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

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


답변

String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));


답변

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

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

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