<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#ffffff">
    On 01/26/2011 11:50 AM, Mark Davis ☕ wrote:
    <blockquote
      cite="mid:AANLkTikTAGPVhub_Rvu=4H-XHWv3tEkvhc+9c9FLLcEe@mail.gmail.com"
      type="cite"><font face="georgia, serif">&gt; 
        <meta charset="utf-8">
        <span class="Apple-style-span" style="font-family: arial;">I
          guess you are asking for something like?</span></font>
      <div><font face="georgia, serif"><br>
        </font></div>
      <div>
        <font face="georgia, serif"><span class="Apple-style-span"
            style="font-family: arial;"></span>I'm not asking for that.
          What I'm saying is that as far as I can tell, there is no way
          in Java to meet the terms of </font>
        <meta charset="utf-8">
        RL1.1, because there is not a way to use hex numbers in any
        syntax for values above FFFF to indicate literals. That is, if
        you supply "abc\\uD800\\uDC00def" then regex fails.
        <div>
          <br>
        </div>
        <div>The code was my attempt to try to get something to work
          even using separate surrogates (which was not the intent of
          RL1.1), but even that failed. Maybe there is another way to do
          it?<br>
          <div><font class="Apple-style-span" face="georgia, serif"><br>
            </font></div>
          <div><font face="georgia, serif">Mark<br>
              <i></i></font><br>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    Oh, I see the problem. Obviously I have been working on jdk7 too
    long and forgot the<br>
    latest release is still 6:-( There is indeed a bug in the previous
    implementation which I<br>
    fixed in 7 long time ago (I mentioned this in one of the early
    emails but was not specific,<br>
    my apology), probably should backport to 6 update release asap. The
    test case runs well<br>
    (the "failures" in literals are expected) on 7 with the following
    output. I modified your test<br>
    case "slightly" since it appears the UnicodeSet class in our
    normalizer package does not<br>
    have the size(), replace it with a normal hashset.<br>
    <br>
    -Sherman<br>
    <br>
    ------------------------------------------------------------------<br>
    LITERALS Failures: 18<br>
        set: [9, 10, 11, 12, 13, 32, 35, 36, 40, 41, 42, 43, 63, 91, 92,
    94, 123, 124]<br>
        example1: a    b<br>
        exampleN: a|b<br>
    INLINE Failures: 0<br>
        set: []<br>
        example1: null<br>
        exampleN: null<br>
    INRANGE Failures: 0<br>
        set: []<br>
        example1: null<br>
        exampleN: null<br>
    <br>
-----------------------------------------------------------------------<br>
    import java.util.regex.*;<br>
    import java.util.*;<br>
    import sun.text.normalizer.*;<br>
    <br>
    public class TestRegex2 {<br>
    <br>
       public static void main(String[] args) {<br>
    <br>
            System.out.println("Check patterns for Unicodeset");<br>
    <br>
            for (int i = 0; i &lt;= 0x10FFFF; ++i) {<br>
                // The goal is to make a regex with hex digits, and have
    it match the corresponding character<br>
                // We check two different environments: inline ("aXb")
    and in a range ("a[X]b")<br>
    <br>
    <br>
                String s = new
    StringBuilder().appendCodePoint(i).toString();<br>
                String hexPattern = i &lt;= 0xFFFF ? "\\u" +
    Utility.hex(i,4) <br>
                        : "\\u" + Utility.hex(Character.toChars(i)[0],4)
    + "\\u" + Utility.hex(Character.toChars(i)[1],4);<br>
    <br>
                String target = "a" + s + "b";<br>
    <br>
                Failures.LITERALS.checkMatch(i, "a" + s + "b", target);<br>
                Failures.INLINE.checkMatch(i, "a" + hexPattern + "b",
    target);<br>
                Failures.INRANGE.checkMatch(i, "a[" + hexPattern + "]b",
    target);<br>
            }<br>
    <br>
            Failures.LITERALS.showFailures();<br>
            Failures.INLINE.showFailures();<br>
            Failures.INRANGE.showFailures();<br>
        }<br>
    <br>
    <br>
        static enum Failures {<br>
    <br>
            LITERALS, INLINE, INRANGE;<br>
    <br>
            Set&lt;Integer&gt; failureSet = new
    LinkedHashSet&lt;Integer&gt;();<br>
            String firstSampleFailure;<br>
            String lastSampleFailure;<br>
    <br>
            void checkMatch(int codePoint, String pattern, String
    target) {<br>
    <br>
                if (!matches(pattern, target)) {<br>
                    failureSet.add(codePoint);<br>
                    if (firstSampleFailure == null) {<br>
                        firstSampleFailure = pattern;<br>
                    }<br>
                    lastSampleFailure = pattern;<br>
                }<br>
            }<br>
    <br>
            boolean matches(String hexPattern, String target) {<br>
                try {<br>
                    // use COMMENTS to get the 'worst case'<br>
                    return Pattern.compile(hexPattern,
    Pattern.COMMENTS).matcher(target).matches();<br>
                } catch (Exception e) {<br>
                    return false;<br>
                }<br>
            }<br>
    <br>
            void showFailures() {<br>
                System.out.format(this + " Failures: %s\n\tset:
    %s\n\texample1: %s\n\texampleN: %s\n", <br>
                        failureSet.size(), failureSet,
    firstSampleFailure, lastSampleFailure);        }<br>
    <br>
        }<br>
    <br>
  </body>
</html>