2010-02-18 4 views
2
내가 문자열을 구문 분석하고 어떤 값을 캡처해야

의 잘못된 번호 캡처 :이 정규식 그룹

FREQ = 매주, WKST = MO; BYDAY = 2TU, 2WE

내가 캡처 할 2 그룹 :

grp 1: 2, 2 
grp 2: TU, WE 

숫자는 간격을 나타냅니다. TU, 우리는 평일을 나타냅니다. 나 둘 다 필요해.

private final static java.util.regex.Pattern regBYDAY = java.util.regex.Pattern.compile(".*;BYDAY=(?:([+-]?[0-9]*)([A-Z]{2}),?)*.*"); 

String rrule = "FREQ=WEEKLY;WKST=MO;BYDAY=2TU,2WE"; 
java.util.regex.Matcher result = regBYDAY.matcher(rrule); 
if (result.matches()) 
{ 
    int grpCount = result.groupCount(); 
    for (int i = 1; i < grpCount; i++) 
    { 
     String g = result.group(i); 
     ... 
    } 
} 

grpCount의 == 2 - 이유 :

은이 코드를 사용하고 있습니다? 자바 문서를 올바르게 읽으면 (저 조금) 5를 얻어야합니까? 0 = 전체 식, 1,2,3,4 = 내 캡처 2,2, TU와 WE.

result.group (1) == "2";

저는 Java가 거의없는 C# 프로그래머이므로 RegEx를 테스트하기위한 훌륭한 C# 프로그램 인 "Regular Expression Workbench"에서 RegEx를 테스트했습니다. 저기 RegEx가 잘 작동합니다.

https://code.msdn.microsoft.com/RegexWorkbench

RegExWB :

.*;BYDAY=(?:([+-]?[0-9]*)([A-Z]{2}),?)*.* 

Matching: 
FREQ=WEEKLY;WKST=MO;BYDAY=22TU,-2WE,+223FR 
    1 => 22 
    1 => -2 
    1 => +223 
    2 => TU 
    2 => WE 
    2 => FR 
+0

는 잘 모르겠어요 무엇을 도구는 자바에서 필요한 것을하기 위해 사용할 수 있지만, 단서는 정규 표현식에는'([+ -]? [0-9] *)'와'([AZ] {2})' – Johrn

+0

예 - 사실입니다. 하나는 Interval, 하나는 Weekday입니다. C#에서 (.net) 정규식에 더 많은 히트가있을 경우 캡처 그룹에 결과 배열을 가져옵니다. RegExWB 샘플과 같습니다. 그룹 1에는 3 개의 명중, 그룹 2 또한있다. 이것은 Java에서도 가능합니까? – Arthur

답변

1

하는 데 도움이 특정 지점의 indepe까지 그것은 C#에서와 마찬가지로

final Pattern re1 = Pattern.compile(".*;BYDAY=(.*)"); 
final Pattern re2 = Pattern.compile("(?:([+-]?[0-9]*)([A-Z]{2}),?)"); 

final Matcher matcher1 = re1.matcher(rrule); 
if (matcher1.matches()) { 
    final String group1 = matcher1.group(1); 
    Matcher matcher2 = re2.matcher(group1); 
    while(matcher2.find()) { 
     System.out.println("group: " + matcher2.group(1) + " " + 
        matcher2.group(2)); 
    } 
} 
+0

아 -이게 내가 원하는 것 같아. 나는 내일 그것을 시험해 볼 것이다, 지금 나는 피자 맥주를 얻을 것이다. 여기 저녁입니다 ... – Arthur

+0

완벽하게 작동합니다! 고맙습니다! find()가 내가 놓친 것이었다. – Arthur

0

나는 약간 녹슨 해요,하지만 난 "주의"를 제안합니다. 우선, 정규 표현식은 여러 가지 방언으로 나옵니다. 이것에 관한 환상적인 O'Reilly 책이 있지만, C# 유틸리티가 약간 다른 규칙을 적용 할 가능성이 있습니다.

는 예를 들어, 나는 모든

먼저 그것은 당신의 정규 표현식 거부 ... 비슷한 (하지만 tool을 다른을)를 사용하고 물건 differenty을 분석 한 것을 발견했다 (아마 오타?) "*"초기를 앞에서 점 (.)을 넣지 않으면 말이되지 않습니다. 이와 같이 :

이제는 허용되었지만 2/WE 부분 만 "일치"하고 2/TU 쌍을 건너 뛰었습니다. .

는 (I는 다음과 같이 나는 당신의 패턴을 업데이트 따라서

이 좀 더 잘 이해하기 위해 욕심 아닌 욕심 일치에 대해 읽어 제안 :

.*;BYDAY=(?:([+-]?[0-9]*)([A-Z]{2}),?),(?:([+-]?[0-9]*)([A-Z]{2}),?)*.* 

을 그리고 지금은 작동하고 올바르게 2를 캡처 , TU, 2, 우리.

은 어쩌면이 또한 가독성을 높이기 위해이 방법을 사용할 수 있나요?

+0

THX - 예, 사본 및 과거 오류가 있습니다. 초기 정규 표현식에 대한 가정이 맞습니다. 제 질문을 업데이트 할 것입니다. 하지만 RegEx가 이해할 수있는 방법으로 평일에는 두 부분이 있다고 가정합니다. 하지만 1에서 6까지 허용됩니다 (또는 0에서 7까지는 의미가 없습니다). Intervals를 사용하여 요일의 가변 개수를 캡처해야합니다. 코드 샘플과 RegExWB 샘플 비교. – Arthur

+0

구체적으로이 RegEx는 Java java.util.regex.Pattern dialect를 사용해야합니다. http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html – Powerlord

+0

불행히도이 두 번째 경우에는 작동하지 않습니다. 'FREQ = 주간, WKST = MO, 오늘 = 22TU, -2WE, + 223FR' –

1

귀하의 정규식 자바에서 동일한 작동하는 일반적인 정규 표현식 집합을 사용하여 구현에서 ndence; Java에서 각 그룹의 최종 캡처에만 액세스 할 수 있습니다. 사실 .NET은 중간 포착 (Perl 6이 다른 것임)을 검색 할 수있게 해주는 두 가지 정규식 중 하나입니다.

String s= "FREQ=WEEKLY;WKST=MO;BYDAY=22TU,-2WE,+223FR"; 
Pattern p = Pattern.compile("(?:;BYDAY=|,)([+-]?[0-9]+)([A-Z]{2})"); 
Matcher m = p.matcher(s); 
while (m.find()) 
{ 
    System.out.printf("Interval: %5s, Day of Week: %s%n", 
        m.group(1), m.group(2)); 
} 

여기에 해당하는 C# 코드는 경우의 당신이 관심이 :

이 자바에서 당신이 원하는 것을 할 수있는 간단한 방법 아마

string s = "FREQ=WEEKLY;WKST=MO;BYDAY=22TU,-2WE,+223FR"; 
Regex r = new Regex(@"(?:;BYDAY=|,)([+-]?[0-9]+)([A-Z]{2})"); 
foreach (Match m in r.Matches(s)) 
{ 
    Console.WriteLine("Interval: {0,5}, Day of Week: {1}", 
        m.Groups[1], m.Groups[2]); 
} 
관련 문제