나는 문자열을 가지고 "004-034556"
나는 두 개의 문자열로 분할 할 것을 :
string1="004";
string2="034556";
즉, 첫 번째 문자열에는 이전 문자가 포함 '-'
되고 두 번째 문자열에는 이후 문자가 포함됩니다 '-'
. 또한 문자열에 포함되어 있는지 확인하고 싶습니다 '-'
. 그렇지 않다면 예외를 던질 것입니다. 어떻게해야합니까?
답변
적절한 방법을 사용하십시오 : String#split()
.
String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556
정규 표현식 이 필요 하므로 필요한 경우 특수 문자 를 이스케이프 해야합니다.
이 백 슬래시 : 특별한 의미 12 개 문자는
\
, 캐럿^
, 달러 기호$
, 기간은 나 도트.
, 세로 막대 또는 파이프 기호|
, 물음표?
, 별표 또는 스타*
, 더하기 기호+
, 여는 괄호(
, 닫는 괄호를)
, 및 여는 대괄호[
, 여는 중괄호이{
특수 문자를 종종 “메타 문자”라고합니다.
당신은 예를 들어 기간에 분할 싶다면, / 점 .
“어떤 의미 모든 문자 정규식에서”이, 하나를 사용 백 슬래시를\
개별 특수 그래서 같은 문자 탈출 split("\\.")
, 또는 사용 문자 클래스를[]
과 같이 리터럴 문자 (들)을 표현하기 위해 split("[.]")
, 또는 사용 Pattern#quote()
에 전체 문자열을 이스케이프 처리하십시오 split(Pattern.quote("."))
.
String[] parts = string.split(Pattern.quote(".")); // Split on period.
문자열에 특정 문자가 포함되어 있는지 미리 테스트하려면을 사용하십시오 String#contains()
.
if (string.contains("-")) {
// Split it.
} else {
throw new IllegalArgumentException("String " + string + " does not contain -");
}
이것은 정규 표현식을 사용하지 않습니다. 이를 위해 String#matches()
대신 사용하십시오.
결과 부분에 분할 문자를 유지하려면 긍정적 인 둘러보기를 사용 하십시오 . 분할 문자를 왼쪽으로 끝내 ?<=
려면 패턴에서 접두사 그룹을 지정하여 긍정적 인 lookbehind를 사용 하십시오.
String string = "004-034556";
String[] parts = string.split("(?<=-)");
String part1 = parts[0]; // 004-
String part2 = parts[1]; // 034556
분할 문자를 오른쪽으로 끝내 ?=
려면 패턴에 그룹 접두사를 지정하여 긍정적 인 미리보기를 사용 하십시오.
String string = "004-034556";
String[] parts = string.split("(?=-)");
String part1 = parts[0]; // 004
String part2 = parts[1]; // -034556
결과 부분의 수를 제한하려면 원하는 수를 split()
방법의 두 번째 인수로 제공 할 수 있습니다 .
String string = "004-034556-42";
String[] parts = string.split("-", 2);
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556-42
답변
문자열을 직접 처리하는 대안은 캡처 그룹과 함께 정규식을 사용하는 것입니다. 이것은 입력에 대한보다 복잡한 제약을 암시하는 것이 간단하다는 장점이 있습니다. 예를 들어, 다음은 문자열을 두 부분으로 나누고 둘 다 숫자로만 구성되도록합니다.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class SplitExample
{
private static Pattern twopart = Pattern.compile("(\\d+)-(\\d+)");
public static void checkString(String s)
{
Matcher m = twopart.matcher(s);
if (m.matches()) {
System.out.println(s + " matches; first part is " + m.group(1) +
", second part is " + m.group(2) + ".");
} else {
System.out.println(s + " does not match.");
}
}
public static void main(String[] args) {
checkString("123-4567");
checkString("foo-bar");
checkString("123-");
checkString("-4567");
checkString("123-4567-890");
}
}
이 인스턴스에서 패턴이 고정되면 패턴을 미리 컴파일하여 정적 멤버 (예 : 클래스로드 시간에 초기화 됨)로 저장할 수 있습니다. 정규식은 다음과 같습니다.
(\d+)-(\d+)
괄호는 캡처 그룹을 나타냅니다. 정규 표현식의 해당 부분과 일치하는 문자열은 표시된대로 Match.group () 메서드로 액세스 할 수 있습니다. \ d는 10 진수와 일치하며, +는 “이전 식의 하나 이상 일치”를 의미합니다.-특별한 의미가 없으므로 입력에서 해당 문자와 일치합니다. 백 슬래시를 두 번 이스케이프해야합니다. 이것을 Java 문자열로 쓸 때 다른 몇 가지 예 :
([A-Z]+)-([A-Z]+) // Each part consists of only capital letters
([^-]+)-([^-]+) // Each part consists of characters other than -
([A-Z]{2})-(\d+) // The first part is exactly two capital letters,
// the second consists of digits
답변
String[] result = yourString.split("-");
if (result.length != 2)
throw new IllegalArgumentException("String not in correct format");
이렇게하면 줄이 두 부분으로 나뉩니다. 배열의 첫 번째 요소는의 앞에 물건 -
을 포함하는 부분이되고 배열의 두 번째 요소는의 뒤에 문자열 부분을 포함합니다 -
.
배열 길이가 2가 아닌 경우 문자열은 형식이 아닙니다 string-string
.
수업 에서 split()
방법을 확인하십시오 String
.
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-int-
답변
String[] out = string.split("-");
당신이 원하는 일을해야합니다. 문자열 클래스에는 문자열로 작동하는 많은 방법이 있습니다.
답변
// This leaves the regexes issue out of question
// But we must remember that each character in the Delimiter String is treated
// like a single delimiter
public static String[] SplitUsingTokenizer(String subject, String delimiters) {
StringTokenizer strTkn = new StringTokenizer(subject, delimiters);
ArrayList<String> arrLis = new ArrayList<String>(subject.length());
while(strTkn.hasMoreTokens())
arrLis.add(strTkn.nextToken());
return arrLis.toArray(new String[0]);
}
답변
자바 8 :
List<String> stringList = Pattern.compile("-")
.splitAsStream("004-034556")
.collect(Collectors.toList());
stringList.forEach(s -> System.out.println(s));
답변
요구 사항은 해석의 여지가되었습니다. 방법을 쓰는 것이 좋습니다.
public final static String[] mySplit(final String s)
이 기능을 캡슐화합니다. 물론 구현에 대한 다른 답변에서 언급 한 것처럼 String.split (..)을 사용할 수 있습니다.
입력 문자열과 원하는 결과 및 동작에 대한 단위 테스트를 작성해야합니다.
좋은 시험 응시자는 다음을 포함해야합니다.
- "0022-3333"
- "-"
- "5555-"
- "-333"
- "3344-"
- "--"
- ""
- "553535"
- "333-333-33"
- "222--222"
- "222--"
- "--4555"
해당 테스트 결과를 정의하면 동작을 지정할 수 있습니다.
예를 들어, 반환 "-333"
해야 [,333]
하거나 오류 인 경우. "333-333-33"
분리 할 수 있습니까 [333,333-33] or [333-333,33]
아니면 오류입니까? 등등.