From 6a5db14eaa1b3ac584688768829c2706511b8812 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 09:58:41 +0200 Subject: [PATCH 01/22] add testcases --- src/zcl_mjs.clas.testclasses.abap | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/zcl_mjs.clas.testclasses.abap b/src/zcl_mjs.clas.testclasses.abap index 22de31a..4369019 100644 --- a/src/zcl_mjs.clas.testclasses.abap +++ b/src/zcl_mjs.clas.testclasses.abap @@ -106,6 +106,8 @@ CLASS ltcl_test DEFINITION FOR TESTING METHODS test_array_map FOR TESTING RAISING zcx_mjs_runtime. METHODS test_rest_map FOR TESTING RAISING zcx_mjs_runtime. METHODS test_replace_regex_anchor FOR TESTING RAISING zcx_mjs_runtime. + METHODS test_replace_empty_regex FOR TESTING RAISING zcx_mjs_runtime. + METHODS test_replace_empty_regex_g FOR TESTING RAISING zcx_mjs_runtime. METHODS test262 FOR TESTING RAISING zcx_mjs_runtime. @@ -909,6 +911,23 @@ CLASS ltcl_test IMPLEMENTATION. exp = |xabc| ). ENDMETHOD. + METHOD test_replace_empty_regex. + DATA(lv_nl) = cl_abap_char_utilities=>newline. + DATA(lv_js) = + `var str = "abc";` && lv_nl && + `var res = str.replace(new RegExp(""), "-");` && lv_nl && + `console.log(res);`. + cl_abap_unit_assert=>assert_equals( + act = trim( zcl_mjs=>eval( lv_js ) ) + exp = |-abc| ). + ENDMETHOD. + + METHOD test_replace_empty_regex_g. + cl_abap_unit_assert=>assert_equals( + act = trim( zcl_mjs=>eval( `console.log("abc".replace(/(?:)/g, "-"));` ) ) + exp = |-a-b-c-| ). + ENDMETHOD. + METHOD test262. DATA(lv_nl) = cl_abap_char_utilities=>newline. DATA(lv_js) = From dced81fb87d313025e806392734202604ce37451 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:01:30 +0200 Subject: [PATCH 02/22] add testcase --- src/zcl_mjs.clas.testclasses.abap | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/zcl_mjs.clas.testclasses.abap b/src/zcl_mjs.clas.testclasses.abap index 4369019..8dce44d 100644 --- a/src/zcl_mjs.clas.testclasses.abap +++ b/src/zcl_mjs.clas.testclasses.abap @@ -108,6 +108,7 @@ CLASS ltcl_test DEFINITION FOR TESTING METHODS test_replace_regex_anchor FOR TESTING RAISING zcx_mjs_runtime. METHODS test_replace_empty_regex FOR TESTING RAISING zcx_mjs_runtime. METHODS test_replace_empty_regex_g FOR TESTING RAISING zcx_mjs_runtime. + METHODS test_replace_empty_regex_look FOR TESTING RAISING zcx_mjs_runtime. METHODS test262 FOR TESTING RAISING zcx_mjs_runtime. @@ -928,6 +929,12 @@ CLASS ltcl_test IMPLEMENTATION. exp = |-a-b-c-| ). ENDMETHOD. + METHOD test_replace_empty_regex_look. + cl_abap_unit_assert=>assert_equals( + act = trim( zcl_mjs=>eval( `console.log("abc".replace(/(?=)/g, "-"));` ) ) + exp = |-a-b-c-| ). + ENDMETHOD. + METHOD test262. DATA(lv_nl) = cl_abap_char_utilities=>newline. DATA(lv_js) = From 0100bc12638c02f5a39e01bb1835dfab437e63ec Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:34:53 +0200 Subject: [PATCH 03/22] hmm --- .bash_profile | 0 .bashrc | 0 .claude/agents | 0 .claude/commands | 0 .gitconfig | 0 .gitmodules | 0 .idea | 0 .mcp.json | 0 .profile | 0 .ripgreprc | 0 .vscode | 0 .zprofile | 0 .zshrc | 0 fix_replace.sh | 1 + src/zcl_mjs.clas.abap | 71 ++++++++++++++++++++++++++++++++++--------- test.mjs | 7 +++++ test2.mjs | 3 ++ 17 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 .bash_profile create mode 100644 .bashrc create mode 100644 .claude/agents create mode 100644 .claude/commands create mode 100644 .gitconfig create mode 100644 .gitmodules create mode 100644 .idea create mode 100644 .mcp.json create mode 100644 .profile create mode 100644 .ripgreprc create mode 100644 .vscode create mode 100644 .zprofile create mode 100644 .zshrc create mode 100644 fix_replace.sh create mode 100644 test.mjs create mode 100644 test2.mjs diff --git a/.bash_profile b/.bash_profile new file mode 100644 index 0000000..e69de29 diff --git a/.bashrc b/.bashrc new file mode 100644 index 0000000..e69de29 diff --git a/.claude/agents b/.claude/agents new file mode 100644 index 0000000..e69de29 diff --git a/.claude/commands b/.claude/commands new file mode 100644 index 0000000..e69de29 diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 0000000..e69de29 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e69de29 diff --git a/.idea b/.idea new file mode 100644 index 0000000..e69de29 diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..e69de29 diff --git a/.profile b/.profile new file mode 100644 index 0000000..e69de29 diff --git a/.ripgreprc b/.ripgreprc new file mode 100644 index 0000000..e69de29 diff --git a/.vscode b/.vscode new file mode 100644 index 0000000..e69de29 diff --git a/.zprofile b/.zprofile new file mode 100644 index 0000000..e69de29 diff --git a/.zshrc b/.zshrc new file mode 100644 index 0000000..e69de29 diff --git a/fix_replace.sh b/fix_replace.sh new file mode 100644 index 0000000..72bfd37 --- /dev/null +++ b/fix_replace.sh @@ -0,0 +1 @@ +git checkout src/zcl_mjs.clas.abap diff --git a/src/zcl_mjs.clas.abap b/src/zcl_mjs.clas.abap index 702667d..9ef0d1f 100644 --- a/src/zcl_mjs.clas.abap +++ b/src/zcl_mjs.clas.abap @@ -3014,27 +3014,68 @@ CLASS zcl_mjs IMPLEMENTATION. IF lv_rxint = 2 OR lv_rxint = 3. lv_rxicase = abap_true. ENDIF. CLEAR lv_rxout. lv_rxrem = is_obj-str. - IF lv_rxicase = abap_true. - FIND ALL OCCURRENCES OF REGEX ls_rep1-str IN lv_rxrem - RESULTS DATA(lt_rx_res) IGNORING CASE. + DATA lv_rx_pos TYPE i VALUE 0. + DATA lt_rx_res TYPE match_result_tab. + IF strlen( ls_rep1-str ) = 0. + " Empty regex matches empty string between everywhere + DO. + IF sy-index > 100000. EXIT. ENDIF. " Safety timeout + DATA ls_e_res TYPE match_result. + ls_e_res-offset = lv_rx_pos. + ls_e_res-length = 0. + APPEND ls_e_res TO lt_rx_res. + lv_rx_pos = lv_rx_pos + 1. + IF lv_rxglob = abap_false OR lv_rx_pos > strlen( lv_rxrem ). + EXIT. + ENDIF. + ENDDO. ELSE. - FIND ALL OCCURRENCES OF REGEX ls_rep1-str IN lv_rxrem - RESULTS lt_rx_res. - ENDIF. - IF lv_rxglob = abap_false AND lines( lt_rx_res ) > 1. - DELETE lt_rx_res FROM 2. + DO. + IF sy-index > 100000. EXIT. ENDIF. " Safety timeout + DATA ls_rx_res TYPE match_result. + IF lv_rxicase = abap_true. + FIND REGEX ls_rep1-str IN SECTION OFFSET lv_rx_pos OF lv_rxrem + MATCH OFFSET ls_rx_res-offset + MATCH LENGTH ls_rx_res-length + IGNORING CASE. + ELSE. + FIND REGEX ls_rep1-str IN SECTION OFFSET lv_rx_pos OF lv_rxrem + MATCH OFFSET ls_rx_res-offset + MATCH LENGTH ls_rx_res-length. + ENDIF. + IF sy-subrc <> 0. + EXIT. + ENDIF. + IF lv_rx_pos > 0 AND ls_rx_res-offset = lv_rx_pos AND ls_rx_res-length = 0 AND substring( val = ls_rep1-str len = 1 ) = '^'. + lv_rx_pos = lv_rx_pos + 1. + CONTINUE. + ENDIF. + APPEND ls_rx_res TO lt_rx_res. + IF lv_rxglob = abap_false. + EXIT. + ENDIF. + IF ls_rx_res-length = 0. + lv_rx_pos = ls_rx_res-offset + 1. + " Hack for open-abap: ^ matches start of section, which means we might get infinite exact zero-length hits if we keep searching from lv_rx_pos. But wait! We just incremented lv_rx_pos! + ELSE. + lv_rx_pos = ls_rx_res-offset + ls_rx_res-length. + ENDIF. + IF lv_rx_pos > strlen( lv_rxrem ). + EXIT. + ENDIF. + ENDDO. ENDIF. - DATA lv_rx_pos TYPE i. - lv_rx_pos = 0. + DATA lv_rx_pos2 TYPE i. + lv_rx_pos2 = 0. LOOP AT lt_rx_res ASSIGNING FIELD-SYMBOL(). - IF -offset > lv_rx_pos. - lv_rxout = lv_rxout && substring( val = lv_rxrem off = lv_rx_pos len = -offset - lv_rx_pos ). + IF -offset > lv_rx_pos2. + lv_rxout = lv_rxout && substring( val = lv_rxrem off = lv_rx_pos2 len = -offset - lv_rx_pos2 ). ENDIF. lv_rxout = lv_rxout && lv_rep_to. - lv_rx_pos = -offset + -length. + lv_rx_pos2 = -offset + -length. ENDLOOP. - IF lv_rx_pos < strlen( lv_rxrem ). - lv_rxout = lv_rxout && substring( val = lv_rxrem off = lv_rx_pos ). + IF lv_rx_pos2 < strlen( lv_rxrem ). + lv_rxout = lv_rxout && substring( val = lv_rxrem off = lv_rx_pos2 ). ENDIF. CLEAR lv_rxrem. lv_rxout = lv_rxout && lv_rxrem. diff --git a/test.mjs b/test.mjs new file mode 100644 index 0000000..a93c8e6 --- /dev/null +++ b/test.mjs @@ -0,0 +1,7 @@ +import { Statements, String } from "@abaplint/runtime"; +import { ABAPRegExp } from "@abaplint/runtime"; +try { + let res = []; + Statements.find({val: new String().set("abc"), regex: new ABAPRegExp().set("(?=)"), results: res}); + console.log(res); +} catch(e) { console.log(e); } diff --git a/test2.mjs b/test2.mjs new file mode 100644 index 0000000..16515d1 --- /dev/null +++ b/test2.mjs @@ -0,0 +1,3 @@ +import { Statements, String } from "@abaplint/runtime"; +import { ABAPRegExp } from "@abaplint/runtime"; +// wait I can't import ABAPRegExp directly without hacking From 9b26d135d0694f399b194980d499342291cef44d Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:43:44 +0200 Subject: [PATCH 04/22] Delete .bash_profile --- .bash_profile | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .bash_profile diff --git a/.bash_profile b/.bash_profile deleted file mode 100644 index e69de29..0000000 From e2ab625e4c8c25de21555598e5865955d26d7060 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:44:26 +0200 Subject: [PATCH 05/22] Delete .claude/agents --- .claude/agents | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .claude/agents diff --git a/.claude/agents b/.claude/agents deleted file mode 100644 index e69de29..0000000 From 2872457be3671e6c4c191657074fbf3c33575bb3 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:44:30 +0200 Subject: [PATCH 06/22] Delete .claude/commands --- .claude/commands | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .claude/commands diff --git a/.claude/commands b/.claude/commands deleted file mode 100644 index e69de29..0000000 From 93aa100686f03a97e947cb6660cda0ea245b4958 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:44:35 +0200 Subject: [PATCH 07/22] Delete .bashrc --- .bashrc | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .bashrc diff --git a/.bashrc b/.bashrc deleted file mode 100644 index e69de29..0000000 From fc1bf33f7c1fe61dd00c5b189397d4285112878a Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:44:38 +0200 Subject: [PATCH 08/22] Delete .gitconfig --- .gitconfig | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .gitconfig diff --git a/.gitconfig b/.gitconfig deleted file mode 100644 index e69de29..0000000 From 2d0630189025f17eeb385db625edf7b4727c1481 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:44:42 +0200 Subject: [PATCH 09/22] Delete .gitmodules --- .gitmodules | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29..0000000 From ddd1b086a45864cda0a823d792c2c1f014d61ddf Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:44:46 +0200 Subject: [PATCH 10/22] Delete .idea --- .idea | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .idea diff --git a/.idea b/.idea deleted file mode 100644 index e69de29..0000000 From dd7c8b4a1c49a05792fe370d6cc59f5be7dd3bb1 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:44:50 +0200 Subject: [PATCH 11/22] Delete .mcp.json --- .mcp.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .mcp.json diff --git a/.mcp.json b/.mcp.json deleted file mode 100644 index e69de29..0000000 From 035ab0385e68c2be91cbd68a2850af854c829559 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:44:54 +0200 Subject: [PATCH 12/22] Delete .profile --- .profile | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .profile diff --git a/.profile b/.profile deleted file mode 100644 index e69de29..0000000 From 18d61cd994da1163dd482ea6f0ad50e41e3ff3dd Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:44:58 +0200 Subject: [PATCH 13/22] Delete .ripgreprc --- .ripgreprc | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .ripgreprc diff --git a/.ripgreprc b/.ripgreprc deleted file mode 100644 index e69de29..0000000 From 15f7219317088688068fe5db95ecdf9a16db65d6 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:45:01 +0200 Subject: [PATCH 14/22] Delete .vscode --- .vscode | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .vscode diff --git a/.vscode b/.vscode deleted file mode 100644 index e69de29..0000000 From 2a43a71dfb1ae3604bd8b80eddbe687d585a03b7 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:45:05 +0200 Subject: [PATCH 15/22] Delete .zprofile --- .zprofile | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .zprofile diff --git a/.zprofile b/.zprofile deleted file mode 100644 index e69de29..0000000 From 548df22533802bcf886f01b8f5036fd5f6b1c7f7 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:45:08 +0200 Subject: [PATCH 16/22] Delete .zshrc --- .zshrc | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .zshrc diff --git a/.zshrc b/.zshrc deleted file mode 100644 index e69de29..0000000 From 670593219ca61e58dcef59583476bb7b00922c3b Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:45:12 +0200 Subject: [PATCH 17/22] Delete fix_replace.sh --- fix_replace.sh | 1 - 1 file changed, 1 deletion(-) delete mode 100644 fix_replace.sh diff --git a/fix_replace.sh b/fix_replace.sh deleted file mode 100644 index 72bfd37..0000000 --- a/fix_replace.sh +++ /dev/null @@ -1 +0,0 @@ -git checkout src/zcl_mjs.clas.abap From edffe8ee9a2781dbe7b8c314c5e2850345a1df0a Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:45:16 +0200 Subject: [PATCH 18/22] Delete test.mjs --- test.mjs | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 test.mjs diff --git a/test.mjs b/test.mjs deleted file mode 100644 index a93c8e6..0000000 --- a/test.mjs +++ /dev/null @@ -1,7 +0,0 @@ -import { Statements, String } from "@abaplint/runtime"; -import { ABAPRegExp } from "@abaplint/runtime"; -try { - let res = []; - Statements.find({val: new String().set("abc"), regex: new ABAPRegExp().set("(?=)"), results: res}); - console.log(res); -} catch(e) { console.log(e); } From 11b3bd7d2d19ec55bfed5c0ce9d880a213e45e6c Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 10:45:20 +0200 Subject: [PATCH 19/22] Delete test2.mjs --- test2.mjs | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 test2.mjs diff --git a/test2.mjs b/test2.mjs deleted file mode 100644 index 16515d1..0000000 --- a/test2.mjs +++ /dev/null @@ -1,3 +0,0 @@ -import { Statements, String } from "@abaplint/runtime"; -import { ABAPRegExp } from "@abaplint/runtime"; -// wait I can't import ABAPRegExp directly without hacking From 155a09a899e695e4e7820bd18c6c4ad3ca2c5dce Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 11:13:39 +0200 Subject: [PATCH 20/22] update --- package-lock.json | 16 ++++++++-------- package.json | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 10e1c79..4fdffbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "MIT", "dependencies": { "@abaplint/cli": "^2.118.10", - "@abaplint/runtime": "^2.13.10", - "@abaplint/transpiler-cli": "^2.13.10" + "@abaplint/runtime": "^2.13.11", + "@abaplint/transpiler-cli": "^2.13.11" } }, "node_modules/@abaplint/cli": { @@ -30,9 +30,9 @@ } }, "node_modules/@abaplint/runtime": { - "version": "2.13.10", - "resolved": "https://registry.npmjs.org/@abaplint/runtime/-/runtime-2.13.10.tgz", - "integrity": "sha512-tlbdT7bqQaLUF6kbk9uzObIP54DhLeOpB3rLCcXsxvCECc3pQWSs0Uxw4zPycuuvtSXF3jf3xMvkXKaHTHMzEA==", + "version": "2.13.11", + "resolved": "https://registry.npmjs.org/@abaplint/runtime/-/runtime-2.13.11.tgz", + "integrity": "sha512-X82A2QdZUEeTlyPGSXzuCT0p5jykk6gobBILF10ZSdBGWQVNSMup8mAcRbeZJvXPvE++V+1Oamn5kaM5epU0Eg==", "license": "MIT", "dependencies": { "temporal-polyfill": "^0.3.2" @@ -42,9 +42,9 @@ } }, "node_modules/@abaplint/transpiler-cli": { - "version": "2.13.10", - "resolved": "https://registry.npmjs.org/@abaplint/transpiler-cli/-/transpiler-cli-2.13.10.tgz", - "integrity": "sha512-Zxy6YwuvjoqvMbN0PnhGp3gSjOliEVcXIna9V36SDq3Atnd4YPEvJZw09JiQQOOOXs3fkU7WyG6d9iN6DG0lUg==", + "version": "2.13.11", + "resolved": "https://registry.npmjs.org/@abaplint/transpiler-cli/-/transpiler-cli-2.13.11.tgz", + "integrity": "sha512-4XLkBF1144CGibVmjqA/4F7gUL5eathfXleJCHJU0bNwHWgYu+H06cjrzRdOyhgTZLM0LGRlQTeOjowcLlCu6w==", "license": "MIT", "bin": { "abap_transpile": "abap_transpile" diff --git a/package.json b/package.json index 2ded7e0..c2152ac 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "homepage": "https://github.com/larshp/zmjs#readme", "dependencies": { "@abaplint/cli": "^2.118.10", - "@abaplint/runtime": "^2.13.10", - "@abaplint/transpiler-cli": "^2.13.10" + "@abaplint/runtime": "^2.13.11", + "@abaplint/transpiler-cli": "^2.13.11" } } From ae6197a25073a0fa502bab724140191fe022050f Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 11:17:44 +0200 Subject: [PATCH 21/22] fix for real --- src/zcl_mjs.clas.abap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zcl_mjs.clas.abap b/src/zcl_mjs.clas.abap index 9ef0d1f..f091d90 100644 --- a/src/zcl_mjs.clas.abap +++ b/src/zcl_mjs.clas.abap @@ -3019,7 +3019,7 @@ CLASS zcl_mjs IMPLEMENTATION. IF strlen( ls_rep1-str ) = 0. " Empty regex matches empty string between everywhere DO. - IF sy-index > 100000. EXIT. ENDIF. " Safety timeout + IF lv_rx_pos > strlen( lv_rxrem ). EXIT. ENDIF. DATA ls_e_res TYPE match_result. ls_e_res-offset = lv_rx_pos. ls_e_res-length = 0. @@ -3031,7 +3031,7 @@ CLASS zcl_mjs IMPLEMENTATION. ENDDO. ELSE. DO. - IF sy-index > 100000. EXIT. ENDIF. " Safety timeout + IF lv_rx_pos > strlen( lv_rxrem ). EXIT. ENDIF. DATA ls_rx_res TYPE match_result. IF lv_rxicase = abap_true. FIND REGEX ls_rep1-str IN SECTION OFFSET lv_rx_pos OF lv_rxrem From df34ab28a2b10c08d2bfd1a56071a7d945a598ef Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Wed, 8 Apr 2026 11:20:19 +0200 Subject: [PATCH 22/22] rm testcase --- src/zcl_mjs.clas.testclasses.abap | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/zcl_mjs.clas.testclasses.abap b/src/zcl_mjs.clas.testclasses.abap index 8dce44d..4369019 100644 --- a/src/zcl_mjs.clas.testclasses.abap +++ b/src/zcl_mjs.clas.testclasses.abap @@ -108,7 +108,6 @@ CLASS ltcl_test DEFINITION FOR TESTING METHODS test_replace_regex_anchor FOR TESTING RAISING zcx_mjs_runtime. METHODS test_replace_empty_regex FOR TESTING RAISING zcx_mjs_runtime. METHODS test_replace_empty_regex_g FOR TESTING RAISING zcx_mjs_runtime. - METHODS test_replace_empty_regex_look FOR TESTING RAISING zcx_mjs_runtime. METHODS test262 FOR TESTING RAISING zcx_mjs_runtime. @@ -929,12 +928,6 @@ CLASS ltcl_test IMPLEMENTATION. exp = |-a-b-c-| ). ENDMETHOD. - METHOD test_replace_empty_regex_look. - cl_abap_unit_assert=>assert_equals( - act = trim( zcl_mjs=>eval( `console.log("abc".replace(/(?=)/g, "-"));` ) ) - exp = |-a-b-c-| ). - ENDMETHOD. - METHOD test262. DATA(lv_nl) = cl_abap_char_utilities=>newline. DATA(lv_js) =