여러 구분 기호와 함께 String.split () 사용


201

문자열 기반을 구분 기호 -및 로 분리해야합니다 .. 아래는 내가 원하는 결과입니다.

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

그러나 다음 코드는 작동하지 않습니다.

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}

말한 내용에 따라 제대로 작동하는 것 같습니다. 원하는 결과는 무엇입니까?
Jeff

2
@Jeff : 그는 원하는 출력을 보여주었습니다 ( AA/ BB/ CC...)
TJ Crowder

2
확실합니까? 나는 그것을 그의 원하는 출력이 아닌 그의 현재 출력으로 해석했습니다. 아마 일어 서서 조금 걸을 시간입니다.
Jeff

@ Jeff : 혼란을 드려 죄송합니다. 귀하의 오해를 없애기 위해 게시물을 업데이트했습니다.
Thang Pham

정규식은 성능을 저하시킵니다. 필요한 경우 문자별로 문자를 나누고 문자열을 나눌 방법을 작성하는 것이 좋습니다. 이 성능을 최적화하여 log (n) 성능을 얻을 수 있습니다.
Princesh

답변:


311

정규식 OR 연산자 를 포함해야한다고 생각합니다 .

String[]tokens = pdfName.split("-|\\.");

일치하는 항목 : [DASH 또는 DOT 중 하나
]가 -.
아닌
[DASH 와 함께 DOT] -또는.


9
왜 우리는 두 개의 백 슬래시가 필요합니까 ??
pjain

7
.정규식 의 문자는 줄 바꾸기 이외 의 문자를 의미합니다. tutorialspoint.com/java/java_regular_expressions.htm 그러나이 경우 실제 문자를 원했습니다 .. 두 개의 백 슬래시는 참조하고 있음을 나타냅니다 .. 백 슬래시는 이스케이프 문자입니다.
Monkeygrinder

2
정상적인 경우 .split("match1|match2"), 예를 들어 split("https|http"), \\는 .위의 경우 특수 문자를 피하는 것입니다
prayagupd

또는 일반적 pdfName.split("\\W");으로 다음과 같이 사용할 수 있습니다. @Peter Knego answer
ahmednabil88

1
[-.]대신 사용-|\\.
Saeed

49

이 정규식을 사용해보십시오 "[-.]+". + after는 연속 분리 문자를 하나로 취급합니다. 원하지 않는 경우 플러스를 제거하십시오.


8
@Lurkers : Peter가 탈출 할 필요가 없었던 유일한 이유 -는 그것이 내부 에서 처음으로 생각 했기 []때문입니다. 그렇지 않으면 앞에 백 슬래시가 있어야합니다 (물론, 백 슬래시를 앞에 두려면 문자열 리터럴이므로 두 개가 필요합니다 ).
TJ Crowder

논리 연산자를 사용할 때 문제는 분리 문자 중 하나가 결과 '토큰'의 일부가 될 수 있기 때문에이 대답이 승인 된 것보다 낫다고 생각합니다. Peter Knego의 [-.] +
Jack '

26

정규식 "\ W"를 사용할 수 있습니다. 이는 단어가 아닌 문자와 일치합니다. 필요한 줄은 다음과 같습니다.

String[] tokens=pdfName.split("\\W");

그것은 나를 위해 작동하지 않습니다`String s = "id (INT), name (STRING),". 여기서 \\ W를 사용하면 길이가 6 인 배열이 만들어집니다. 여기서는 4
일뿐입니다.

2
입력에 유니 코드 문자가 포함 된 경우에도 중단됩니다. 로 '모두 가져 오기'대신 실제 구분 기호 만 포함하는 것이 가장 좋습니다 \W.
nhahtdh

13

제공 split하는 문자열은 정규식의 문자열 형식이므로 다음과 같습니다.

private void getId(String pdfName){
    String[]tokens = pdfName.split("[\\-.]");
}

즉 , 내부의 특수 문자 이므로 백 슬래시 []로 이스케이프 처리해야합니다 . 물론 문자열이기 때문에 백 슬래시를 이스케이프 처리해야합니다. (반대로, 일반적으로 특별하지만 내부 에서는 특별 하지 않습니다 .)-[].[]


이 경우 하이픈을 이스케이프 할 필요가 없습니다 [-.]. 범위로 해석 할 수 없기 때문 입니다.
Alan Moore

1
@Alan : 수업에서 가장 먼저하기 때문에, 그것은 사실입니다. 그러나 나는 항상 그렇습니다. 나중에 돌아가서 생각없이 무언가를 앞에 추가하는 것은 너무 쉽습니다. 그것을 탈출하는 데 아무런 비용이 들지 않습니다.
TJ Crowder

괄호를 피하는 방법을 알고 있습니까? "200", "엔지니어링"으로 나누고 싶은 문자열 "[200] 엔지니어링"
scottysseus

3
오 와우 .. 나는 하나 대신 두 개의 백 슬래시를 사용해야했다. String[] strings = codes.get(x).split("\\[|\\]| ");<-관심있는 사람을위한 코드
scottysseus

13

구아바 를 사용하면 다음과 같이 할 수 있습니다.

Iterable<String> tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);

4

델리 미터 "AND"및 "OR"과 같은 두 문자 시퀀스의 경우이 작업을 수행해야합니다. 사용하는 동안 손질하는 것을 잊지 마십시오.

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

결과 : 도시 = { "ISTANBUL", "NEW YORK", "PARIS", "TOKYO", "MOSCOW"}


{ "ISTANBUL AND", "NEW YORK AND", "PARIS OR", "TOKYO AND", "MOSCOW"}와 같은
출력물을 얻는 방법

3

Apache Commons를 사용합니다.

수입 org.apache.commons.lang3.StringUtils;

private void getId(String pdfName){
    String[] tokens = StringUtils.split(pdfName, "-.");
}

StringUtils.splitByWholeSeparator(str, separator)전체 문자열을 구분 기호로 사용 하는 것이 아니라 지정된 구분 기호로 분할됩니다.


3
String[] token=s.split("[.-]");

9
StackOverflow가 무료 코드 작성 서비스라는 오해와 싸우면 도움이 될 것입니다. 약간의 설명만으로 코드 전용 답변을 보강하십시오.
Yunnosch 2016 년

2

다음과 같은 것을 사용하는 것이 좋습니다 :

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

샘플로 몇 가지 다른 문자를 추가했습니다. 방법 .과 치료법이 있기 때문에 이것이 가장 안전한 방법 '입니다.


1

split () 메소드에서 정규식을 인수로 지정할 수도 있습니다. 아래 예를 참조하십시오.

private void getId(String pdfName){
String[]tokens = pdfName.split("-|\\.");
}

1

이 코드를 사용해보십시오 :

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);

1
StackOverflow가 무료 코드 작성 서비스라는 오해와 싸우면 도움이 될 것입니다.
Yunnosch 2016 년

0
s.trim().split("[\\W]+") 

작동해야합니다.


2
첫째, 아니요, 작동하지 않습니다. 게시하기 전에 사용해 볼 수 있습니까? 그런 다음 이 답변 은 귀하와 동일하지만 작동합니다. 마지막으로 형식을 확인 해야합니다 (작동해야합니다. ).
Arount

1
StackOverflow가 무료 코드 작성 서비스라는 오해와 싸우면 도움이 될 것입니다.
Yunnosch 2016 년

-1

찌르기가 항상 같은 형식임을 알면 먼저 문자열을 기준으로 분할하고 문자열을 .변수의 첫 번째 색인에 저장하십시오. 그런 다음 -인덱스 0, 1 및 2를 기준으로 두 번째 인덱스의 문자열을 분할하고 마지막 배열을 기준으로 이전 배열의 인덱스 2를 분할 .하면 모든 관련 필드를 확보해야합니다.

다음 스 니펫을 참조하십시오.

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...

6
한 단계로 수행 할 수 있으므로 한 단계로 수행 할 수 있습니다. 다른 답글을 참조하십시오.
Kaj

2
pdfName.split(".")길이가 0 인 배열이됩니다.
Alan Moore

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