All Downloads are FREE. Search and download functionalities are using the official Maven repository.

regexodus.PerlSubstitution Maven / Gradle / Ivy

Go to download

JVM AOT compiler currently generating JavaScript, C++, Haxe, with initial focus on Kotlin and games.

There is a newer version: 0.6.8
Show newest version
/**
 * Copyright (c) 2001, Sergey A. Samokhodkin
 * All rights reserved.
 * 
* Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: *
* - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form * must reproduce the above copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided with the distribution. * - Neither the name of jregex nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @version 1.2_01 */ package regexodus; import com.jtransc.annotation.JTranscInvisible; import java.io.Serializable; /** * An implementation of the Substitution interface. Performs substitutions in accordance with Perl-like substitution scripts.
* The latter is a string, containing a mix of memory register references and plain text blocks.
* It may look like "some_chars $1 some_chars$2some_chars" or "123${1}45${2}67".
* A tag consisting of '$',not preceded by the escape character'\' and followed by some digits (possibly enclosed in the * curly brackets) is interpreted as a memory register reference, the digits forming a register ID. If you follow '$' * with curly brackets, you can also use the Java-identifier-like named groups that may have been defined in the search * pattern (as well as pure numbers for non-named register IDs), and can specify different modes for the replacement * with punctuation between the opening bracket and the group name. Modes can be specified by any combination or order * of '@' to get a case-folded (lower-case-only) replacement of the matched group, '/' to get the reverse of the string * matched by the group, and ':' to get any opening or closing bracket characters (Unicode categories Ps and Pe, * including parentheses, square brackets, and curly brackets among many others) in the matched group replaced by their * closing or opening counterparts. All the rest is considered plain text.
* Upon the Replacer has found a text block that matches the pattern, a references in a replacement string are replaced by the contents of * corresponding memory registers, and the resulting text replaces the matched block.
* For example, the following code: *
 * System.out.println("\""+
 *    new Replacer(new Pattern("\\b(\\d+)\\b"),new PerlSubstitution("'$1'")).replace("abc 123 def")
 *    +"\"");
 * 
* will print "abc '123' def".
* @see Substitution * @see Replacer * @see Pattern */ @JTranscInvisible public class PerlSubstitution implements Substitution, Serializable { //private static Pattern refPtn,argsPtn; private static Pattern refPtn; private static int MODE_ID; private static int NAME_ID; private static int ESC_ID; static final int MODE_INSENSITIVE = 1, MODE_REVERSE = 2, MODE_BRACKET = 4; //private static int FN_NAME_ID; //private static int FN_ARGS_ID; //private static int ARG_NAME_ID; private static final String groupRef = "\\$(?:\\{({=mode}\\p{Po}+)?({=name}\\w+)\\})|({=name}\\d+|\\&)|\\\\({esc}.)"; //private static final String fnRef="\\&({fn_name}\\w+)\\(({fn_args}"+groupRef+"(?:,"+groupRef+")*)*\\)"; static { try { //refPtn=new Pattern("(?= match.pattern().groupCount()) return; if (match.isCaptured(i)) match.getGroup(i, dest, modes); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; IntRefHandler that = (IntRefHandler) o; if (modes != that.modes) return false; return index != null ? index.equals(that.index) : that.index == null; } @Override public int hashCode() { int result = index != null ? index.hashCode() : 0; result = 31 * result + modes; return result; } } private static class StringRefHandler extends Element { private String index; private int modes; StringRefHandler(String s, String ind, int modes) { prefix = s; index = ind; this.modes = modes; } void append(MatchResult match, TextBuffer dest) { if (prefix != null) dest.append(prefix); if (index == null) return; //if(id==null) return; //??? int i = match.pattern().groupId(index); if (match.isCaptured(i)) match.getGroup(i, dest, modes); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; StringRefHandler that = (StringRefHandler) o; if (modes != that.modes) return false; return index != null ? index.equals(that.index) : that.index == null; } @Override public int hashCode() { int result = index != null ? index.hashCode() : 0; result = 31 * result + modes; return result; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy