2016-11-06 3 views
1
abc([^\r\n]*) // 0 or more 

abc([^\r\n]+)? // 1 or more, but it's optional 

자바. 그들은 나에게 똑같이 보입니다.이 두 정규식의 차이는 무엇입니까?

+1

그들은 나에게도 똑같이 보입니다. –

+1

'abc'의 경우 첫 번째는 첫 번째 캡처 그룹에 빈 문자열을 저장하고 두 번째 그룹은이 그룹을 저장하지 않지만 그룹에 액세스하려고 할 때 어떤 일이 발생하는지 Java에 익숙하지 않습니다. 1. 조건 매칭 (PCRE, Boost, .net 등) 또는 대체 (Boost)가 지원되는 다른 regex 맛은이 차이가 큰 점에 유의하십시오. 오와 델파이는 이름이 일치하지 않는 캡처 그룹에 액세스하는 데 문제가 있습니다. –

+0

와우. 나는 그저 그것을 시험해야만했고 나는 틀린 대답을 게시했다고 생각합니다. https://regex101.com/r/H6nkxD/1는 다른 파서가 그룹'''(...)에 대해 실제로 다르게 행동한다는 것을 보여줍니다.'' – Art

답변

2

둘 사이에 약간의 차이가 있습니다. 다음 code

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

class Example 
{ 
    public static void main (String[] args) 
    { 
     String text = "abc"; 
     Pattern p1 = Pattern.compile("abc([^\\r\\n]*)"); 
     Matcher m1 = p1.matcher(text); 
     if (m1.find()) { 
      System.out.println("MatchCount: " + m1.groupCount()); 
      System.out.println("Group 1: " + m1.group(1)); 
     } else { 
      System.out.println("No match."); 
     } 
     Pattern p2 = Pattern.compile("abc([^\\r\\n]+)?"); 
     Matcher m2 = p2.matcher(text); 
     if (m2.find()) { 
      System.out.println("MatchCount: " + m2.groupCount()); 
      System.out.println("Group 1: " + m2.group(1)); 
     } else { 
      System.out.println("No match."); 
     } 
    } 
} 

는 출력을 제공 :

번째의 그룹이 비어있어 일치하지 않는 상태에서 제 정규식 빈 콘텐츠 캡처 그룹을 생성 따라서 문자열 abc 경우
MatchCount: 1 
Group 1: 
MatchCount: 1 
Group 1: null 

. 비록 내가 자바에 익숙하지 않더라도, 나는 당신이 그들을 조금 다르게 다루어야 할 것이라고 생각할 것이다.

(!) 참고 :이 큰 차이를 만들 것입니다 곳

자바 조건 매칭을 지원 (PCRE는 달리, .NET, 좀 더 부스트와)과 조건 (부스트와는 달리) 대체하지 않습니다. 오, 델파이는 issues with optional named capturing groups입니다.