boolean matchAnchor()

in src/main/java/org/apache/xmlbeans/impl/regex/RegularExpression.java [1425:1514]


    boolean matchAnchor(ExpressionTarget target, Op op, Context con, int offset, int opts) {
        boolean go = false;
        switch (op.getData()) {
            case '^':
                if (isSet(opts, MULTIPLE_LINES)) {
                    if (!(offset == con.start
                            || offset > con.start && offset < con.limit && isEOLChar(target.charAt(offset-1))))
                        return false;
                } else {
                    if (offset != con.start)
                        return false;
                }
                break;

            case '@':                         // Internal use only.
                // The @ always matches line beginnings.
                if (!(offset == con.start
                        || offset > con.start && isEOLChar(target.charAt(offset-1))))
                    return false;
                break;

            case '$':
                if (isSet(opts, MULTIPLE_LINES)) {
                    if (!(offset == con.limit
                            || offset < con.limit && isEOLChar(target.charAt(offset))))
                        return false;
                } else {
                    if (!(offset == con.limit
                            || offset+1 == con.limit && isEOLChar(target.charAt(offset))
                            || offset+2 == con.limit &&  target.charAt(offset) == CARRIAGE_RETURN
                            &&  target.charAt(offset+1) == LINE_FEED))
                        return false;
                }
                break;

            case 'A':
                if (offset != con.start)  return false;
                break;

            case 'Z':
                if (!(offset == con.limit
                        || offset+1 == con.limit && isEOLChar(target.charAt(offset))
                        || offset+2 == con.limit &&  target.charAt(offset) == CARRIAGE_RETURN
                        &&  target.charAt(offset+1) == LINE_FEED))
                    return false;
                break;

            case 'z':
                if (offset != con.limit)  return false;
                break;

            case 'b':
                if (con.length == 0)
                    return false;
            {
                int after = getWordType(target, con.start, con.limit, offset, opts);
                if (after == WT_IGNORE)  return false;
                int before = getPreviousWordType(target, con.start, con.limit, offset, opts);
                if (after == before)  return false;
            }
            break;

            case 'B':
                if (con.length == 0)
                    go = true;
                else {
                    int after = getWordType(target, con.start, con.limit, offset, opts);
                    go = after == WT_IGNORE
                            || after == getPreviousWordType(target, con.start, con.limit, offset, opts);
                }
                if (!go)  return false;
                break;

            case '<':
                if (con.length == 0 || offset == con.limit)  return false;
                if (getWordType(target, con.start, con.limit, offset, opts) != WT_LETTER
                        || getPreviousWordType(target, con.start, con.limit, offset, opts) != WT_OTHER)
                    return false;
                break;

            case '>':
                if (con.length == 0 || offset == con.start)  return false;
                if (getWordType(target, con.start, con.limit, offset, opts) != WT_OTHER
                        || getPreviousWordType(target, con.start, con.limit, offset, opts) != WT_LETTER)
                    return false;
                break;
        } // switch anchor type

        return true;
    }