import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "(?P<prop>[\\w-]+) # property name\n"
+ " (?P<prop_params>; # property params, e.g. dstparams \n"
+ " ( [\\w/,-]+(=[\\w/,-]+)?) # first param key[=val] element\n"
+ " (;[\\w/,-]+(=[\\w/,-]+)?)* # additional key[=val] elements\n"
+ ")?: # colon separator between prop and main params\n"
+ "(?P<params> # main params\n"
+ " ( [\\w/,-]+(=[\\w/,-]+)?) # first param key[=val] element\n"
+ " (;[\\w/,-]+(=[\\w/,-]+)?)* # additional key[=val] elements\n"
+ ")";
final String string = "RRULE:FREQ=WEEKLY;UNTIL=20211231T183000Z;INTERVAL=1;BYDAY=TU,TH\n"
+ "RRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=4;BYDAY=FR\n"
+ "RRULE:FREQ=DAILY;UNTIL=20150628;INTERVAL=3\n"
+ "RRULE:FREQ=DAILY;UNTIL=20150628\n"
+ "RRULE:FREQ=DAILY\n"
+ "RRULE:ABC;DEF=GHI;jkl;abc=999\n\n"
+ "# negative example\n"
+ "RRULE:\n\n"
+ "# more examples\n"
+ "DTSTART;TZID=America/New_York:19980101T090000\n"
+ "DTSTART;TZID=America/New_York:AB\n"
+ "DTSTART;TZID=America;more;junk:AB=123;DE=456\n"
+ "DTSTART;TZID=America:AB\n"
+ "DTSTART;junk:ABC=12333\n"
+ "RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU;UNTIL=19860427T070000Z\n"
+ "DT;junk;more;junk=junk:ABC;YZO=123\n\n"
+ "RDATE;VALUE=DATE:20150609,20150611\n"
+ "EXDATE;VALUE=DATE:20150610\n"
+ "RDATE;TZID=America/New_York:19970714T083000\n"
+ "RDATE;VALUE=DATE:19970101,19970120,19970217,19970421\n"
+ " 19970526,19970704,19970901,19971014,19971128,19971129,19971225\n\n"
+ " RRULE:FREQ=YEARLY;UNTIL=20000131T140000Z;BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA\n\n"
+ " BEGIN:VTIMEZONE\n"
+ " TZID:America/New_York\n"
+ " LAST-MODIFIED:20050809T050000Z\n"
+ " BEGIN:DAYLIGHT\n"
+ " DTSTART:19670430T020000\n"
+ " RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU;UNTIL=19730429T070000Z\n"
+ " TZOFFSETFROM:-0500\n"
+ " TZOFFSETTO:-0400\n"
+ " TZNAME:EDT\n"
+ " END:DAYLIGHT\n"
+ " BEGIN:STANDARD\n"
+ " DTSTART:19671029T020000\n"
+ " RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=20061029T060000Z\n"
+ " TZOFFSETFROM:-0400\n"
+ " TZOFFSETTO:-0500\n"
+ " TZNAME:EST\n"
+ " END:STANDARD\n"
+ " BEGIN:DAYLIGHT\n"
+ " DTSTART:19740106T020000\n"
+ " RDATE:19750223T020000\n"
+ " TZOFFSETFROM:-0500\n"
+ " TZOFFSETTO:-0400\n"
+ " TZNAME:EDT\n"
+ " END:DAYLIGHT\n"
+ " BEGIN:DAYLIGHT\n"
+ " DTSTART:19760425T020000\n"
+ " RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU;UNTIL=19860427T070000Z\n"
+ " TZOFFSETFROM:-0500\n"
+ " TZOFFSETTO:-0400\n"
+ " TZNAME:EDT\n"
+ " END:DAYLIGHT\n"
+ " BEGIN:DAYLIGHT\n"
+ " DTSTART:19870405T020000\n"
+ " RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU;UNTIL=20060402T070000Z\n"
+ " TZOFFSETFROM:-0500\n"
+ " TZOFFSETTO:-0400\n"
+ " TZNAME:EDT\n"
+ " END:DAYLIGHT\n"
+ " BEGIN:DAYLIGHT\n"
+ " DTSTART:20070311T020000\n"
+ " RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\n"
+ " TZOFFSETFROM:-0500\n"
+ " TZOFFSETTO:-0400\n"
+ " TZNAME:EDT\n"
+ " END:DAYLIGHT\n"
+ " BEGIN:STANDARD\n"
+ " DTSTART:20071104T020000\n"
+ " RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\n"
+ " TZOFFSETFROM:-0400\n"
+ " TZOFFSETTO:-0500\n"
+ " TZNAME:EST\n"
+ " END:STANDARD\n"
+ " END:VTIMEZONE";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.COMMENTS);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Java, please visit: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html