# HG changeset patch # User Jaroslav Tulach # Date 1380306050 -7200 # Node ID 635ee75d82a5aaf5d2b13b3f52a9a84f8e0e5b7a # Parent 7aa365d2cc1aca5de7b709b0f706f314d8cbfc54 JavaOne attendees asked for support for String.replaceAll, so here it is diff -r 7aa365d2cc1a -r 635ee75d82a5 rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/RegExpReplaceAllTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/RegExpReplaceAllTest.java Fri Sep 27 20:20:50 2013 +0200 @@ -0,0 +1,54 @@ +/** + * Back 2 Browser Bytecode Translator + * Copyright (C) 2012 Jaroslav Tulach + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. Look for COPYING file in the top folder. + * If not, see http://opensource.org/licenses/GPL-2.0. + */ +package org.apidesign.bck2brwsr.tck; + +import org.apidesign.bck2brwsr.vmtest.Compare; +import org.apidesign.bck2brwsr.vmtest.VMTest; +import org.testng.annotations.Factory; + +/** + * + * @author Jaroslav Tulach + */ +public class RegExpReplaceAllTest { + + @Compare public String replaceAll() { + return "JavaScript".replaceAll("Script", "One"); + } + + @Compare public String replaceAllTwice() { + return "Script JavaScript!".replaceAll("Script", "One"); + } + + + @Compare public String replaceAllRegexp() { + return "JavaScript".replaceAll("S....t", "One"); + } + + @Compare public String replaceAllRegexpTwice() { + return "Script JavaScript!".replaceAll("S....t", "One"); + } + + @Compare public String replaceFirstRegexpOnly() { + return "Script JavaScript!".replaceFirst("S....t", "One"); + } + + @Factory public static Object[] create() { + return VMTest.create(RegExpReplaceAllTest.class); + } +} diff -r 7aa365d2cc1a -r 635ee75d82a5 rt/emul/mini/src/main/java/java/lang/String.java --- a/rt/emul/mini/src/main/java/java/lang/String.java Thu Sep 26 19:41:34 2013 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/String.java Fri Sep 27 20:20:50 2013 +0200 @@ -2159,6 +2159,14 @@ * @since 1.4 * @spec JSR-51 */ + @JavaScriptBody(args = { "regex", "newText" }, body = + "var self = this.toString();\n" + + "var re = new RegExp(regex.toString());\n" + + "var r = re.exec(self);\n" + + "if (r === null || r.length === 0) return this;\n" + + "var from = self.indexOf(r[0]);\n" + + "return this.substring(0, from) + newText + this.substring(from + r[0].length);\n" + ) public String replaceFirst(String regex, String replacement) { throw new UnsupportedOperationException(); } @@ -2203,7 +2211,14 @@ * @spec JSR-51 */ public String replaceAll(String regex, String replacement) { - throw new UnsupportedOperationException(); + String p = this; + for (;;) { + String n = p.replaceFirst(regex, replacement); + if (n == p) { + return n; + } + p = n; + } } /**