2
0
Эх сурвалжийг харах

[jvm] implement regex split differently

closes #9601
Simon Krajewski 5 жил өмнө
parent
commit
9c89a156fb

+ 19 - 4
std/jvm/_std/EReg.hx

@@ -80,11 +80,26 @@ using StringTools;
 	public function split(s:String):Array<String> {
 	public function split(s:String):Array<String> {
 		if (isGlobal) {
 		if (isGlobal) {
 			var ret = [];
 			var ret = [];
-			while (this.match(s)) {
-				ret.push(matchedLeft());
-				s = matchedRight();
+			matcher.reset(s);
+			matcher = matcher.useAnchoringBounds(false).useTransparentBounds(true);
+			var copyOffset = 0;
+			while (true) {
+				if (!matcher.find()) {
+					ret.push(s.substring(copyOffset, s.length));
+					break;
+				}
+				ret.push(s.substring(copyOffset, matcher.start()));
+				var nextStart = matcher.end();
+				copyOffset = nextStart;
+				if (nextStart == matcher.regionStart()) {
+					nextStart++; // zero-length match - shift region one forward
+				}
+				if (nextStart >= s.length) {
+					ret.push("");
+					break;
+				}
+				matcher.region(nextStart, s.length);
 			}
 			}
-			ret.push(s);
 			return ret;
 			return ret;
 		} else {
 		} else {
 			var m = matcher;
 			var m = matcher;

+ 16 - 0
tests/unit/src/unit/issues/Issue9601.hx

@@ -0,0 +1,16 @@
+package unit.issues;
+
+class Issue9601 extends Test {
+	public function test() {
+		#if java
+		utest.Assert.same(["", "Test"], ~/^/g.split("Test"));
+		utest.Assert.same(["Test", ""], ~/$/g.split("Test"));
+		utest.Assert.same(["", "Test", ""], ~/\b/g.split("Test"));
+
+		utest.Assert.same(["", "Test"], ~/^/.split("Test"));
+		utest.Assert.same(["Test", ""], ~/$/.split("Test"));
+		utest.Assert.same(["", "Test"], ~/\b/.split("Test"));
+		#end
+	}
+}
+