2011-10-07 3 views
4

다음 텍스트가 있습니다.정규식, 분할 방법 | 가 전에있을 때 분할하지 않기

 aaa|bbbb|cccc|dddd\|eeee|ffff 

및 | 언제 제외 할 | \로 시작하여

aaa

bbbb

xccx

dddd \ | eeee

xffx

감사합니다.

추신 : 나는 일부 regexp 생성기 (예 : http://txt2re.com/)를 사용하여 시도했지만 솔직히 regexp 아무것도 친절한입니다.

업데이트 : 마침내 포기합니다. Regexp는 빠르지 않습니다 (벤치마킹을 한 것입니다), 어느 누구도 따라 올 수없는 기능과 비교하여 명확하지 않으며, 건너 뛰고 이제는 실제 코드를 사용하고 있습니다.

+0

List<String> matchList = new ArrayList<String>(); Pattern regex = Pattern.compile("(?:\\\\.|[^\\\\|])*"); Matcher regexMatcher = regex.matcher(subjectString); while (regexMatcher.find()) { matchList.add(regexMatcher.group()); } 

이 올바르게 aaa|bbbb\\|cccc|dddd\|eeee|ffff\\\|ggg\\\\|hhhh 분할을 당신이 부정적인 lookbehind 단언을 원하는 것처럼 들린다. – Gabe

+1

왜 'dddd \ eeee'가 아닌'dddd | eeee'입니까? –

+0

패턴이 단순하다면, 문자를 반복 할 수 있으며'|'파이프를 찾으면 나뉘지만 앞의 문자는 백 슬래시'\\'가 아닙니다. 나는 당신의 입력 문자열이 어떻게 만들어 졌는지 모르겠다. 그러나 당신이 그것을 제어 할 수 있다면 \ |를 사용할 수 없다. 해당 위치에 있지만 다른 문자를 사용하십시오 (옵션 인 경우). – jefflunt

답변

2

어쨌든, eyelidlessness의 대답은 나에게 올바른 보이는 ... eyelidlessness의 대답에 주석으로이 문제를 추가하려고하지만,이 포맷하는 방법을 모른다 :

String str = "aaa|bbbb|cccc|dddd\\|eeee|ffff"; 
    String[] tokens = str.split("(?<!\\\\)\\|"); 
    System.out.println(Arrays.toString(tokens));  

하는 인쇄 :

[aaa, bbbb, cccc, dddd\|eeee, ffff] 
+0

이스케이프 된 백 슬래시가 있으면 어떻게됩니까? 'aaaa \\ | bbbb' 예를 들어 ... –

+0

예, 이스케이프 된 백 슬래시는 처리되지 않습니다.하지만 걱정거리인지 아닌지에 따라 달라집니다. 어쩌면 그들은이 포스터가 작업하고있는 어떤 영역에도 존재하지 않을 것입니다. – dule

2

이 그것을 수행해야합니다

(?<!\\\\)\\| 

당신이 백 슬래시 이스케이프 백 슬래시를 허용 할 경우 사용할 수 있습니다 그래서 문자열 aaa|bbbb|cccc|dddd\|eeee\\|ffff이 분할 될 것이라고 주어진

(?<!(?<!\\\\)\\\\)\\| 

을 :


    aaa 
    bbbb 
    cccc 
    dddd|eeee\* 
    ffff 

* 또는 dddd\|eeee\\ 탈출 - 백 슬래시를 제거하지 않으려면 dddd\|eeee\\ 몇몇 이유.

편집 : Java 정규 표현식에 익숙하지 않아 래칫 괴물의 의견에 따라 이스케이프가 추가되었습니다.

+0

자바 구문으로할까요? "(?

+0

@ratchet freak, thanks. – eyelidlessness

+0

감사하지만 작동하지 않습니다 : value1 : aaa | bbbb | cccc | dddd value2 : | eeee | ffff, 나는 "\ |" 안전한 문자를 입력 한 다음 "|" 다시 "\ |"로 바꿉니다. – magallanes

1

split()을 사용하지 마십시오. (당신은 자바 lookbehind 주장 내부의 무한 반복을 지원 할 수 있다면 그러나 그것은하지 않습니다.).

더 나은이 |들 사이의 모든 경기를 수집 :

aaa 
bbbb\\ 
cccc 
dddd\|eeee 
ffff\\\|ggg\\\\ 
hhhh