자바에서 문자 c까지 문자열에서 하위 문자열을 얻는 방법은 무엇입니까?


101

문자열이 있습니다 (기본적으로 명명 규칙을 따르는 파일 이름) abc.def.ghi

첫 번째 .(즉, 점) 앞에 부분 문자열을 추출하고 싶습니다.

Java doc api에서 String에서 메서드를 찾을 수없는 것 같습니다.
내가 뭔가를 놓치고 있습니까? 어떻게하나요?

답변:


65

보고 String.indexOfString.substring.

에 대해 -1을 확인하십시오 indexOf.


1
짧고 달다. 또한 indexOf는 하위 문자열의 첫 번째 인덱스를 제공한다는 점을 기억하십시오.
Neil Chowdhury

112

받아 들여지는 대답은 정확하지만 사용 방법을 알려주지 않습니다. 이것이 indexOf 및 하위 문자열 함수를 함께 사용하는 방법입니다.

String filename = "abc.def.ghi";     // full file name
int iend = filename.indexOf("."); //this finds the first occurrence of "." 
//in string thus giving you the index of where it is in the string

// Now iend can be -1, if lets say the string had no "." at all in it i.e. no "." is found. 
//So check and account for it.

String subString;
if (iend != -1) 
{
    subString= filename.substring(0 , iend); //this will give abc
}

1
중괄호없이 If 문 본문에 변수 선언을 넣을 수 없기 때문에 잘못된 코드입니다.
Clashsoft

84

문자열을 나눌 수 있습니다 ..

public String[] split(String regex)

java.lang.String.split은 구분 기호의 정규식 값을 사용합니다. 기본적으로 이렇게 ...

String filename = "abc.def.ghi";     // full file name
String[] parts = filename.split("\\."); // String array, each element is text between dots

String beforeFirstDot = parts[0];    // Text before the first dot

물론 이것은 명확성을 위해 여러 줄로 나뉩니다. 다음과 같이 쓸 수 있습니다.

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

5
java.lang.String.split은 문자열뿐만 아니라 정규식 값을 속성으로 사용하기 때문에 제안이 올바르지 않습니다. 모두 "." 예에서 "\\"로 변경해야합니다. 그런 다음 작동합니다 :)
Erik Kaju

2
나는 정규식을 좋아하지만 매번 나를 얻습니다.
Chad Schouggins 2013 년

70

프로젝트에서 이미 commons-lang을 사용하는 경우 StringUtils는 이러한 목적을위한 좋은 방법을 제공합니다.

String filename = "abc.def.ghi";

String start = StringUtils.substringBefore(filename, "."); // returns "abc"

javadoc [2.6] [3.1] 참조


다른 솔루션보다 깨끗합니다.
userab

12

또는 다음과 같은 것을 시도 할 수 있습니다.

"abc.def.ghi".substring(0,"abc.def.ghi".indexOf(c)-1);


3
'C'의 충돌합니다 것은 같이 IndexOf 반환하므로 문자열에없는 -1
TofuBeer

@Umer Hayat 만약 파일명이 있다면 def.hij.klm? 그러면 코드가 어떻게 작동합니까? (귀하의 코드는이 한 가지 예에서만 작동합니다. 반환하는 함수를 작성하는 것이 좋습니다. 마찬가지로 "abc"작동합니다.)
Bohemian

@Bohemian : 경계 케이스와 체크가 누락 된 것을 알고 있습니다. 특정 질문에 대한 구체적인 답변이었고 아이디어는 예를 통해 일반적인 아이디어를 제공하는 것이 었습니다.
Umer Hayat 2011 년

1
@TofuBeer : 좋습니다. 이전에는 "(즉, 점)"이 실제 게시물에 없었습니다. 나는 내 대답 이이 문제를 해결하는 일반적인 아이디어를 제공한다고 생각하고 희망합니다.
Umer Hayat 2011 년

2
나는 함께 갈 것이다 : int ix = inString.indexOf ( '.'); if (ix> -1) inString = inString.substring (0, ix); 나는 Umer가 왜 빼기 1을 제안했는지 모르겠습니다. 부분 문자열의 두 번째 인수는 최대이지만 어쨌든 제외합니다.
Micha Berger

4

정규식을 사용하는 것은 어떻습니까?

String firstWord = filename.replaceAll("\\..*","")

이렇게하면 첫 번째 점부터 끝까지 모든 것이 ""로 바뀝니다 (즉, 지우고 원하는 내용을 남깁니다).

다음은 테스트입니다.

System.out.println("abc.def.hij".replaceAll("\\..*", "");

산출:

abc

7
나는 반대표를 던지지 않았지만 (사람들이 아무런 이유없이 반대표를 던지면 짜증나는 데 동의합니다) 당신의 솔루션은 꽤 비싸고 명백하지 않습니다.
TofuBeer 2011 년

1
@ Knickerless-Noggins 나는 그것을 설명 할 수있다. 만약 당신이 구체적인 사항을 원한다면 나도 그렇게 할 수있다 ...하지만 내가 어떻게 코멘트로 할 수 있는지 확실하지 않다 (다른 질문 / 답변을해야 할지도 모른다). 모든 대체 문자와 함께 완전히 새로운 문자열을 생성하기 때문에 비용이 많이 듭니다. 부분 문자열은 단순히보기를 문자열로 반환합니다. 그 도움?
TofuBeer 2013 년

2
@TofuBeer 당신이 잘못되었습니다. 문자열은 변경할 수 없습니다 . 하위 문자열은 뷰를 반환 하지 않습니다 . String 메서드에서 반환 된 모든 String은 새로운 String입니다.
보헤미안

@ Knickerless-Noggins 그는 착각했다 ... 최근 댓글보기. 또한 충분히 효과가 있습니다. 코드 밀도가 높습니다. "성능"을 위해 더 많은 코드를 추가하는 것을 정당화하기 위해 집중적으로 사용해야합니다.
보헤미안

그것은 분명히 JDK 7에서 변경된, javarevisited.blogspot.ca/2011/10/...
TofuBeer

2

java.lang.String에서는 char / string의 첫 번째 인덱스를 반환하는 indexOf ()와 같은 메서드를 얻을 수 있습니다. 및 lstIndexOf : String / char의 마지막 인덱스를 반환합니다.

Java Doc에서 :

  public int indexOf(int ch)
  public int indexOf(String str)

이 문자열 내 에서 지정된 문자 가 처음 나타나는 인덱스를 반환합니다 .


2

다음은 String주어진 문자 목록까지 의 부분 문자열을 반환하는 코드입니다 .

/**
 * Return a substring of the given original string until the first appearance
 * of any of the given characters.
 * <p>
 * e.g. Original "ab&cd-ef&gh"
 * 1. Separators {'&', '-'}
 * Result: "ab"
 * 2. Separators {'~', '-'}
 * Result: "ab&cd"
 * 3. Separators {'~', '='}
 * Result: "ab&cd-ef&gh"
 *
 * @param original   the original string
 * @param characters the separators until the substring to be considered
 * @return the substring or the original string of no separator exists
 */
public static String substringFirstOf(String original, List<Character> characters) {
    return characters.stream()
            .map(original::indexOf)
            .filter(min -> min > 0)
            .reduce(Integer::min)
            .map(position -> original.substring(0, position))
            .orElse(original);
}

1

도움이 될 수 있습니다.

public static String getCorporateID(String fileName) {

    String corporateId = null;

    try {
        corporateId = fileName.substring(0, fileName.indexOf("_"));
        // System.out.println(new Date() + ": " + "Corporate:
        // "+corporateId);
        return corporateId;
    } catch (Exception e) {
        corporateId = null;
        e.printStackTrace();
    }

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