2012-10-03 3 views
6

Android 플랫폼 2.2.3을 타겟팅 할 때 정규식에 문제가 있습니다.Android 선택 단어 경계 정규식

다음 정규 표현식은 내 데스크톱에서 Java VM을 타겟팅 할 때 작동하며 정규 표현식 또한 .NET 응용 프로그램에서도 작동합니다.

Pattern.compile("\\b?") 

그러나 휴대 전화를 타겟팅하면 PatternSyntaxException이 표시됩니다. 어떤 아이디어?

+0

오류의 동기를 모릅니다 ... 그러나 이것은 선택적인 (그러나 길이가 0 인) 단어 경계입니다 ... 당신은 무엇입니까? 결국 일치하러 갈거야 ?? – Gabber

+0

다른 프로젝트의 다소 복잡한 정규 표현식입니다. 그러나 선택 단어 경계가 유효하지 않은 패턴 구문이어야하는 이유는 알 수 없습니다. – Tentux

답변

4

안드로이드 에뮬레이터에서 실행 중일 때 PatternSyntaxException을 던질 수 있지만 일반 Java 응용 프로그램에서는 실행되지 않음을 확인할 수 있습니다. 안드로이드에서 사용되는 정규 표현식 구현이 일반적인 자바 SDK와 다른 점을 제외하고 나는 그 이유가 무엇인지 알 수 없다. Pattern Android 개발자 페이지 :

Android에서 사용되는 정규 표현식 구현은 ICU에서 제공합니다. 정규 표현식의 표기법은 대부분 다른 Java 언어 구현에서 사용되는 표기법의 상위 집합입니다. 이는 기존 애플리케이션이 정상적으로 작동한다는 것을 의미하지만, 드문 경우이지만 Android는 다른 구현에서 허용하지 않는 정규 표현식을 허용 할 수 있습니다.

해결 방법으로, 비 캡처 그룹에 단어 경계 어설 션을 포함시켜 예외를 피할 수 있음을 발견했습니다.

Pattern.compile("(?:\\b)?"); 

는 (A 캡처 그룹은 잘 작동하지만 난 당신이 그것을 필요로 의심한다.)

난 당신이 공식적인 응답을 얻을 수 있는지 확인하기 위해 당신에게 report this as a bug을 제안한다. (나는 이미 수색했으나 아직보고 된 것으로 보이지 않습니다.)

+1

그러나 안드로이드는 레퍼런스 구현이 받아들이는 일부 정규식을 거부한다는 의미에서만 버그라는 것을 명심하십시오. 너비가 0 인 어설 션을 포함시킨 다음 선택 사항으로 만드는 것은 전혀 의미가 없습니다. 당신은 말합니다, *이 조건은 true로 유지되어야하지만, 그렇지 않으면 괜찮습니다. * 그것을 거부함으로써, 컴파일러는 오타 또는 저자의 부분에 대한 이해의 실패 인 것을 경고합니다. –

+1

@ AlanMoore 나는 OP의 정규 표현식의 나머지 부분이 선택적인 단어 경계가 필요해 보일지도 모른다고 상상하려했지만, 네가 옳다고 생각한다. 그것은 말이되지 않습니다. 선택 사항 인 단어 경계를 만드는 방법은 정규식에 단어 경계를 포함시키지 않는 것입니다. –

+0

@BilltheLizard 동의 함. 나는 그것이 합리적이라고 생각하지 않는다. 나는 원래 정규 표현식의 저자가 아니다. 아마 나는 그들의 사용법에 대해 오해했다. 가능성이있는 캡처 그룹의 일부가 될 수 있습니다. 어쨌든, 나는 같은 방법으로 구현하기로 결정했다. – Tentux