|
What this is
Other links
The source code/* * gnu/regexp/RETokenWordBoundary.java * Copyright (C) 2001 Wes Biggs * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package gnu.regexp; /** * Represents a combination lookahead/lookbehind for POSIX [:alnum:]. */ final class RETokenWordBoundary extends REToken { private boolean negated; private int where; static final int BEGIN = 1; static final int END = 2; RETokenWordBoundary(int subIndex, int where, boolean negated) { super(subIndex); this.where = where; this.negated = negated; } boolean match(CharIndexed input, REMatch mymatch) { // Word boundary means input[index-1] was a word character // and input[index] is not, or input[index] is a word character // and input[index-1] was not // In the string "one two three", these positions match: // |o|n|e| |t|w|o| |t|h|r|e|e| // ^ ^ ^ ^ ^ ^ boolean after = false; // is current character a letter or digit? boolean before = false; // is previous character a letter or digit? char ch; // TODO: Also check REG_ANCHORINDEX vs. anchor if (((mymatch.eflags & RE.REG_ANCHORINDEX) != RE.REG_ANCHORINDEX) || (mymatch.offset + mymatch.index > mymatch.anchor)) { if ((ch = input.charAt(mymatch.index - 1)) != CharIndexed.OUT_OF_BOUNDS) { before = Character.isLetterOrDigit(ch) || (ch == '_'); } } if ((ch = input.charAt(mymatch.index)) != CharIndexed.OUT_OF_BOUNDS) { after = Character.isLetterOrDigit(ch) || (ch == '_'); } // if (before) and (!after), we're at end (\>) // if (after) and (!before), we're at beginning (\<) boolean doNext = false; if ((where & BEGIN) == BEGIN) { doNext = after && !before; } if ((where & END) == END) { doNext ^= before && !after; } if (negated) doNext = !doNext; return (doNext ? next(input, mymatch) : false); } void dump(StringBuffer os) { if (where == (BEGIN | END)) { os.append( negated ? "\\B" : "\\b" ); } else if (where == BEGIN) { os.append("\\<"); } else { os.append("\\>"); } } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.