mirror of
https://github.com/corda/corda.git
synced 2025-01-08 14:03:06 +00:00
Support trivial regular expressions with special escaped characters
When a regular expression contains escaped characters such as the backslash, it is actually still a literal string. So let's support the trivially-escaped characters, too, that are documented in http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
parent
466a7fc0c0
commit
f55ac46602
@ -35,20 +35,20 @@ public class Pattern {
|
|||||||
private final String pattern;
|
private final String pattern;
|
||||||
|
|
||||||
protected Pattern(String pattern, int flags) {
|
protected Pattern(String pattern, int flags) {
|
||||||
this.pattern = pattern;
|
this.pattern = trivial(pattern);
|
||||||
this.patternFlags = flags;
|
this.patternFlags = flags;
|
||||||
|
|
||||||
if (! trivial(pattern)) {
|
|
||||||
throw new UnsupportedOperationException
|
|
||||||
("only trivial regular expressions are supported so far (" + pattern + ")");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean trivial(String pattern) {
|
private static String trivial(String pattern) {
|
||||||
|
StringBuffer buffer = new StringBuffer();
|
||||||
for (int i = 0; i < pattern.length(); ++i) {
|
for (int i = 0; i < pattern.length(); ++i) {
|
||||||
char c = pattern.charAt(i);
|
char c = pattern.charAt(i);
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '\\':
|
case '\\':
|
||||||
|
if (++i == pattern.length() || (c = unescape(pattern.charAt(i))) != -1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// fallthru
|
||||||
case '.':
|
case '.':
|
||||||
case '*':
|
case '*':
|
||||||
case '+':
|
case '+':
|
||||||
@ -62,10 +62,32 @@ public class Pattern {
|
|||||||
case ')':
|
case ')':
|
||||||
case '^':
|
case '^':
|
||||||
case '$':
|
case '$':
|
||||||
return false;
|
throw new UnsupportedOperationException
|
||||||
|
("only trivial regular expressions are supported so far (" + pattern + ")");
|
||||||
}
|
}
|
||||||
|
buffer.append(c);
|
||||||
}
|
}
|
||||||
return true;
|
return buffer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static char unescape(char c) {
|
||||||
|
switch (c) {
|
||||||
|
case '\\':
|
||||||
|
return c;
|
||||||
|
case 'a':
|
||||||
|
return 0x0007;
|
||||||
|
case 'e':
|
||||||
|
return 0x001B;
|
||||||
|
case 'f':
|
||||||
|
return 0x000C;
|
||||||
|
case 'n':
|
||||||
|
return 0x000A;
|
||||||
|
case 'r':
|
||||||
|
return 0x000D;
|
||||||
|
case 't':
|
||||||
|
return 0x0009;
|
||||||
|
}
|
||||||
|
return (char)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Pattern compile(String regex) {
|
public static Pattern compile(String regex) {
|
||||||
|
Loading…
Reference in New Issue
Block a user