/* * Pattern.java * * Copyright (C) 2009-12 by RStudio, Inc. * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ package org.rstudio.core.client.regex; import com.google.gwt.core.client.JavaScriptObject; public class Pattern extends JavaScriptObject { public interface ReplaceOperation { String replace(Match m); } protected Pattern() {} public static native Pattern create(String pattern) /*-{ return new RegExp(pattern, 'gm') ; }-*/ ; public static native Pattern create(String pattern, String flags) /*-{ return new RegExp(pattern, flags) ; }-*/ ; public final native int search(String string) /*-{ return string.search(this); }-*/; public final native Match match(String input, int index) /*-{ this.lastIndex = index ; var result = this.exec(input) ; if (result == null) return null ; return { value: result[0], index: result.index, input: input, next: this.lastIndex, pattern: this, match: result } ; }-*/ ; public final native boolean test(String input) /*-{ return this.test(input); }-*/; public static String escape(String str) { // Replace every character with its \\uXXXX equivalent StringBuilder output = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); String hexStr = Integer.toHexString(c); output.append("\\u"); for (int j = 4 - hexStr.length(); j > 0; j--) output.append('0'); output.append(hexStr); } return output.toString(); } public native final String replaceAll(String str, String substr) /*-{ return str.replace(this, substr); }-*/; public final String replaceAll(String str, ReplaceOperation op) { StringBuilder result = new StringBuilder(); int tail = 0; // Index of last character copied/replaced from source str Match match = match(str, 0); while (match != null) { if (tail < match.getIndex()) result.append(str, tail, match.getIndex()); result.append(op.replace(match)); tail = match.getIndex() + match.getValue().length(); match = match.nextMatch(); } if (tail < str.length()) result.append(str, tail, str.length()); return result.toString(); } public static native String replace(String find, String repl, boolean caseSensitive) /*-{ return find.replace( new RegExp(find, caseSensitive ? "g" : "ig"), repl); }-*/; }