2013-06-25 2 views
0

정규식을 사용하여 아포스트로피 사이에있는 문자열에서 부분 문자열을 가져 오려고합니다. 문자열의 형식 : Duplicate entry '[email protected]' for key 'email'. 내가 사용하는 정규식 : '([^']*).아포스트로피간에 데이터를 가져 오는 방법 Android

코드 :

Pattern pattern = Pattern.compile("'([^']*)"); 
Matcher matcher = pattern.matcher(duplicated); 
Log.d(TAG, matcher.group())); 

내가 matcher.group()에 대해도 확실하지 오전 전체 정규식과 일치하는 단일 문자열을 반환합니다. 내 경우 두 개의 부분 문자열을 반환해야합니다.

누군가가이 정규식을 해결하고 나에게 설명을 줄 수 있습니까? 미리 감사드립니다.

답변

2

패턴 매칭 대신 .split()을 사용하는 것이 더 좋습니다. 간단하게 하드 코딩합니다. 아래처럼 수행하십시오 :

String[] strSplitted = <Your String>.split("`"); 

그런 다음 strSplitted Array에는`.

+0

네, 처음에 나는처럼하고 싶었다 이것은 "중복 항목", "[email protected]", "키", "이메일"을 반환합니다. 괜찮아요,하지만 "split()"메서드의 효율성에 대해서는 모르겠지만 "[email protected]"및 "email"을 반환하는 정규식은 시간과 메모리가 조금 더 효율적일 것이라고 생각했습니다. 와 "matcher()"가 있습니다. 그래서 split()이 더 좋다고 말하는 것입니다. – Husky

+0

'문제가 발생하여'Matcher()'가 최대 횟수로 실패합니다. 그것을 피하십시오. 'split()'은'Regex'보다 시간 복잡성이 매우 적습니다. 나의 제안은'split()'을 더 잘 사용한다. –

+0

Ok, 고맙다. – Husky

1

이 정규식을 사용합니다. 그것은 거의 당신과 비슷하지만 닫는 작은 따옴표를 포함합니다. 이것은 닫는 작은 따옴표가 다음 일치에서 사용되는 것을 방지하기위한 것입니다.

다음
matcher.group(1) 

자바의 예는 다음과 같습니다 :

Pattern regex = Pattern.compile("'([^']*)'", Pattern.MULTILINE); 
Matcher matcher = regex.matcher(duplicated); 
while (matcher.find()) { 
    Log.d(TAG, matcher.group(1))); 
} 
+0

나는이 것을 이미 시도했지만 "출력"은 다음과 같다. java.lang.IllegalStateException : 지금까지 일치하는 것이 없다. – Husky

+0

@ 허스키 - 이것에 따르면 http://stackoverflow.com/questions/9893875/debugging-pattern-regex-failure-in-in-java-android 먼저 찾기를 호출해야합니다. 아마도 내 솔루션에서 샘플 코드를 사용해 볼 수 있습니다. –

+0

예, find() -> "입력에서 다음 패턴의 패턴을 반환합니다"라는 메시지를 읽었습니다. – Husky

1

가 여기 내 테스트 솔루션입니다 따옴표이 유사한 줄을 사용 내부

'([^']*)' 

는 내용을 얻을 수 있습니다.

[email protected] 
email 
1

나는 다음과 같은 내 솔루션을 발명 : 당신은 find

Pattern pattern = Pattern.compile("'([^']*)'"); 
String duplicated = "Duplicate entry '[email protected]' for key 'email'"; 
Matcher matcher = pattern.matcher(duplicated); 

String a = ""; 
while (matcher.find()) { 
    a += matcher.group(1) + "\n"; 
} 

결과를 호출해야합니다.

int second_index = 0; 
String str = "Duplicate entry '[email protected]' for key 'email'"; 
while (true) { 
    if (second_index == 0) 
     first_index = str.indexOf("'", second_index); 
    else 
     first_index = str.indexOf("'", second_index + 1); 

    if (first_index == -1) 
     break; 

    second_index = str.indexOf("'", first_index + 1); 

    if (second_index == -1) 
     break; 

    String temp = str.substring(first_index + 1, second_index); 

    Log.d("TAG",temp); 
} 

는 출력

06-25 17 : 25 : 17.689 : [email protected]
06-25 17 : 25 : 17.689 : 이메일

+0

이 문제에 대해서도 생각하고 있었지만이 응용 프로그램을 모든 방식이 단순한 방식으로 작성하려고합니다. 가능한 한 조건 수 등을 최소화하여 그러한 해결책을 피하려고 노력했습니다. (나는 당신의 솔루션이 복잡하거나 sth이다라고 주장하지 않고있다. 그러나 단순히 많은 "if"를 사용하여 그런 간단한 작업을 해결하기를 원하지 않는다.) 어쨌든, 엄지! :) – Husky

+0

@Husky, 나는 아무런 문제가 없다. 나는이 질문을하고 내가 해결책을 찾지 못한다면 내가 원하는 사용자 정의를 할 수있는 내 사용자 정의 코드를 의미한다. 나는 잠들 수 없다. 그건 그렇고 행복해. :) –

관련 문제