Codereview request for 7014640: To add a metachar \R for line ending and character classes for vertical/horizontal ws \v \V \h \H
Xueming Shen
xueming.shen at oracle.com
Sat Apr 21 07:56:13 UTC 2012
Hi
Here are the webrev and blenderrev for the proposed change to add 5 new
regex constructs \R \v \V \h \V.
\R: recommended by Unicode Regex TR#18 for matching all line ending
characters and sequences, is equivalent to
( \u000D\u000A | [\u000A\u000B\u000C\u000D\u0085\u2028\u2029] )
\h, \v, \H and \V:
matches any character considered to (not) be horizontal/vertical
whitespace.
Webrev:
http://cr.openjdk.java.net/~sherman/7014640/blenderrev.html
Blenderrev:
http://cr.openjdk.java.net/~sherman/7014640/blenderrev.html
new Pattern api
http://cr.openjdk.java.net/~sherman/7014640/Pattern.html
Here are couple notes regarding the spec/implementation.
(1) \v was implemented as \u000B ('\013'), but not documented (did not
appear in our API
doc as one supported construct, such as \t \r \n...). To define \v as a
"general" construct for
all vertical whitespace characters might trigger some compatibility
concerns (more characters
are now matched by \v). But given this is a never documented
implementation detail and the
\u000B is still being matched by \v, I would consider this as an
acceptable behavior change.
(2) a predefined character class can appear inside another character
class, for example
you can have [...\v...], however, since it represents a "class" of
character, so it can't be
a start or end code point of a range inside a class, so you can have
[a-b], but you can't
have [\h-...] or [...-\h] (exception will be thrown). But for \v, since
it was implemented
as \u000B (VT), you were able to put it as a start or end value of a
range, I feel it'd be
better still keep it the way it worked before, so [\v-\v] works and will
match the VT in
this implementation.
(3) The newly added \h\v\H\V constructs are all "Unicode version" of
character classes, the
rest of the "predefined character class" family (\d\D\s\S\w\W) are ASCII
only, you will have to
turn on flag UNICODE_CHARACTER_CLASS to get the Unicode version of these
constructs. This
is kinda of inconsistent. Perl's corresponding constructs work in a
similar way, all Perl's \d\D\s\S
\w\W\v\V\h\H work in Unicode version, and to have a \a modifier to turn
the \d\D\s\S\w\W
back to ASCII mode but not for \h\v\H\V. We had the discussion back into
JDK7 regarding the
ASCII vs Unicode for these constructs, the decision then was to keep
these predefined character
classes (and POSIX character classes) ASCII by default, to have a flag
UNICODE_CHARACTER_CLASS
to turn them into Unicode version. Given there is NOT an ASCII version
in Perl and we didn't
have ASCII version in Java regex to trigger compatibility concern, I
feel it might be better to
just have a simple Unicode version of \h\v\H\V.
(4)\R is not a character class, since it matched \r\n.
This one will need to go through ccc process.
Thanks,
-Sherman
More information about the core-libs-dev
mailing list