2012-10-12 4 views
0

오류를 검색하기 위해 프로그램의 출력을 구문 분석해야합니다. 오류는 표시됩니다 같은 :Java 패턴이 가장 왼쪽 일치를 반환하지 않습니다.

[(필드 이름/값) = 규칙을 숫자 실패 (/존 칼 무슨 일이다는구?)] [(필드 이름/값) = (newLabel/오스카 아이 패드) 줄에 illegalchars]

가있을 수 있습니다 하나 이상의 오류 규칙을 실패하고, 각 오류에 대해 나는 굵게 단어/문장을 검색 할 수 있습니다.

static String s1 = Pattern.quote("[(FieldName/Value) = ("); 
static String s2 = Pattern.quote(") failed rule"); 
static String s3 = Pattern.quote("]"); 
static Pattern p = Pattern.compile(s1 + "(\\w+)/(.+)" + s2 + "(.+)" + s3); 
while (matcher.find()) { 
    String token = matcher.group(1); 
    sb.append("#"); 
    sb.append(token); 
    token = matcher.group(2); 
    sb.append("#"); 
    sb.append(token); 
    token = matcher.group(3).trim(); 
    sb.append("#"); 
    sb.append(token); 
} 

을하지만 출력은 다음과 같습니다 : 위해 다음과 같이 내가 정규 표현식을 만드는거야 그렇게하는

#phrase#What is Up John Carl?) failed rule alphanumeric] [(FieldName/Value) = (newLabel/Óscar's IPad#illegalchars 

은 그래서 두 경기, 한을 반환하지 않습니다. 첫 번째 "failed rule"에서 멈추는 대신 두 번째 그룹을 나머지 문자열과 일치시킵니다. 나는 그것이 패턴의 첫번째 (.+)에 의한다고 생각한다. 그러나 물건은 무엇이라도 거기에 갈 수있다. 그래서 나는 (.+)를 필요로한다. 어떤 아이디어로 그것을 할 수 있습니까?

답변

1

, 그래서 그 맞는 최대 문자열을 검색합니다 :

static Pattern p = Pattern.compile(s1 + "(\\w+)/(.*?)" + s2 + "(.*?)" + s3); 

는 SO이 다른 예를 살펴 예를 들어, "(ab)(cd)" 정규식 (.+)의 정규식은 ab)(cd을 반환합니다. 당신이 원하는 무엇

꺼린 정량(.+?)이 (+?마르크이)입니다. 그 정규식 덕분에 abcd를 찾을 수 (.+?)으로 정규식

"(ab)(cd)" 일치하는 최소한의 문자열을 찾기 위해 노력할 것입니다.

+0

그건 속임수 였어. 감사!! –

0
Pattern p = Pattern.compile(s1+"(\\w+)/(.*?)" + s2 + "(.*?)" + s3); 
+3

코드를 게시하기보다는 왜이 기능이 적합한 지 잠시 설명해야합니다. – Sam

관련 문제