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;
}