@Test public void quotation() { testRE("(\\Q])(?\\${*\\E)", "])(?\\${*"); testRE("\\Q])(?\\${*\\Ef(o)o", "])(?\\${*foo"); testBadExpression("\\Q])(?\\${*", "unclosed quotation"); }
@Test public void unsupportedFeatures() { testUnsupported("\\h", "horizontal whitespace class"); testUnsupported("\\H", "horizontal whitespace class"); testUnsupported("\\v", "vertical whitespace class"); testUnsupported("\\V", "vertical whitespace class"); testUnsupported("\\1", "back references"); testUnsupported("\\99", "back references"); testUnsupported("\\k<foo>", "back references"); }
@Test public void escapeInCharClass() { testRE("abc_[\\w]+_ghi", "abc_def_ghi"); testRE("abc_[\\w-\\s]+_ghi", "abc_de f-_ghi"); testRE("abc_[\\]]+_ghi", "abc_]_ghi"); testRE("abc_[]]+_ghi", "abc_]_ghi"); testRE("abc_[de\\sf]+_ghi", "abc_ \t\ndef_ghi"); testRE("abc_[\\p{Space}9\\w]+_ghi", "abc_ \t\n9def_ghi"); testRE("abc_[\\t- ]+_ghi", "abc_ \t\n_ghi"); }
@Test public void basic() throws Exception { // Check against basic compatibility tests for re2j loadTestFile("basic.dat").forEach(pair -> testRE(pair[0], pair[1])); }
@Test public void unclosedCharClass() { // unclosed character class, closing brace as first character will be treated as part // of the set testBadExpression("[]", "unclosed character class"); testBadExpression("[\\]", "unclosed character class"); testBadExpression("[^]", "unclosed character class"); testBadExpression("[^\\]", "unclosed character class"); testBadExpression("[", "unclosed character class"); }
private void testBadExpression(String regex, String message) { //Pattern.compile(regex); intercept(IllegalArgumentException.class, message, () -> PatternMatcher.compile(regex)); }
@Test public void nestedCharClass() { testRE("^[a-f&&]*$", "abcdef&"); testRE("^[a-f&]*$", "abcdef&"); testRE("^[a-f[A-F]]*$", "abcdefABCDEF"); testRE("^[a-f[A-F][G-I&&[^H]]]*$", "abcdefABCDEFGI"); testRE("^[a-f[A-F][G-I&&[H]]]*$", "abcdefABCDEFH"); testRE("^[a-f[A-F][G-I&&[H]]]*$", "abcdef&"); testRE("^[a-f[A-F]]*$", "abcdef[]ABCDEF"); testRE("^[a-f[A-F[0-2]]]*$", "abcdefABCDEF012"); }
@Test public void jdk() throws Exception { // Check against basic compatibility tests for jdk based on description in Pattern // javadocs: // https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html loadTestFile("jdk.dat").forEach(pair -> testRE(pair[0], pair[1])); } }
@Test public void danglingModifier() { testBadExpression("?:?abc", "dangling modifier"); testBadExpression("*abc", "dangling modifier"); testBadExpression("+abc", "dangling modifier"); }
private void testUnsupported(String regex, String message) { intercept(UnsupportedOperationException.class, message, () -> PatternMatcher.compile(regex)); }
@Test public void posixAbbreviations() { testBadExpression("\\pabc", "unknown character property name: a"); testBadExpression("\\pLbc", "unknown character property name: L"); }