From b95db433f943b0dadd0de3f716a9c2291b985739 Mon Sep 17 00:00:00 2001 From: AbdurazaaqMohammed <56937889+AbdurazaaqMohammed@users.noreply.github.com> Date: Thu, 2 Jul 2026 18:22:24 -0400 Subject: [PATCH 1/4] Fix replace with regex When regex enabled in search/replace Matcher.quoteReplacement() is making groups in replace not work --- .../modder/hub/dexeditor/fragment/SearchFragment.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java b/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java index 11cc542..44e4523 100644 --- a/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java +++ b/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java @@ -772,7 +772,13 @@ public void run() { StringBuffer sb = new StringBuffer(); while (m.find()) { countInClass++; - m.appendReplacement(sb, Matcher.quoteReplacement(replaceWith)); + try { + m.appendReplacement(sb, replaceWith); + } catch (IndexOutOfBoundsException | IllegalArgumentException e) { + // invalid group reference + errorClasses.add(className + ": invalid replacement pattern - " + e.getMessage()); + return; + } } m.appendTail(sb); modifiedText = sb.toString(); From 811b74104a5849409fc131a468e18986e7b75a77 Mon Sep 17 00:00:00 2001 From: AbdurazaaqMohammed Date: Thu, 2 Jul 2026 18:42:58 -0400 Subject: [PATCH 2/4] Create .gitignore Ignore files like local.properties that is for your system only --- .gitignore | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0a9dea4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties +/local.properties + +# Log/OS Files +*.log + +# Android Studio generated files and folders +captures/ +.externalNativeBuild/ +.cxx/ +*.apk +output.json + +# IntelliJ +*.iml +.idea/ +misc.xml +deploymentTargetDropDown.xml +render.experimental.xml + +# Keystore files +*.jks +*.keystore + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Android Profiling +*.hprof \ No newline at end of file From 5687a1583c8f326dbe8a3586926df14b35f06da9 Mon Sep 17 00:00:00 2001 From: AbdurazaaqMohammed Date: Thu, 2 Jul 2026 18:46:44 -0400 Subject: [PATCH 3/4] Fix replace in type string Search with type string works well but when you do replace it was replacing everywhere in smali not just strings --- .../dexeditor/fragment/SearchFragment.java | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java b/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java index 44e4523..4bde096 100644 --- a/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java +++ b/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java @@ -755,16 +755,32 @@ public void run() { int countInClass = 0; if (type.equals("String")) { - String findPattern = exactlyMatch ? "\"" + Pattern.quote(findQuery) + "\"" : Pattern.quote(findQuery); - String replacePattern = exactlyMatch ? "\"" + java.util.regex.Matcher.quoteReplacement(replaceWith) + "\"" : java.util.regex.Matcher.quoteReplacement(replaceWith); - Pattern p = Pattern.compile(findPattern, matchCase ? 0 : Pattern.CASE_INSENSITIVE); - java.util.regex.Matcher m = p.matcher(originalText); + Matcher lm = Pattern.compile("\"((?:\\\\.|[^\"\\\\])*)\"").matcher(originalText); StringBuffer sb = new StringBuffer(); - while (m.find()) { - countInClass++; - m.appendReplacement(sb, replacePattern); + + int flag = matchCase ? 0 : Pattern.CASE_INSENSITIVE; + String q1 = isRegex ? findQuery : Pattern.quote(findQuery); + String q2 = exactlyMatch ? "^" + q1 + "$" : q1; + Pattern innerFind = Pattern.compile(q2, flag); + + while (lm.find()) { + Matcher im = innerFind.matcher(lm.group(1)); + StringBuffer inner = new StringBuffer(); + while (im.find()) { + countInClass++; + try { + im.appendReplacement(inner, isRegex ? replaceWith : Matcher.quoteReplacement(replaceWith)); + } catch (IndexOutOfBoundsException | IllegalArgumentException e) { + errorClasses.add(className + ": invalid replacement pattern - " + e.getMessage()); + return; + } + } + im.appendTail(inner); + + String newLiteral = "\"" + inner + "\""; + lm.appendReplacement(sb, Matcher.quoteReplacement(newLiteral)); } - m.appendTail(sb); + lm.appendTail(sb); modifiedText = sb.toString(); } else { if (isRegex) { From a7164685805544107ca688304b2fdbe934811e63 Mon Sep 17 00:00:00 2001 From: AbdurazaaqMohammed Date: Thu, 2 Jul 2026 19:49:30 -0400 Subject: [PATCH 4/4] add spaces in Total replaced dialog --- .../main/java/modder/hub/dexeditor/fragment/SearchFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java b/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java index 4bde096..07811aa 100644 --- a/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java +++ b/app/src/main/java/modder/hub/dexeditor/fragment/SearchFragment.java @@ -903,7 +903,7 @@ private String generateSmali(ClassDef classDef) throws Exception { @SuppressLint("NotifyDataSetChanged") private void onPostExecute(DexEditorActivity activity) { if (progressDialog.isShowing()) progressDialog.dismiss(); - Notify_MT.Notify(activity, "Info", "Total replaced " + replacedCount.get() + "times in " + affectedClasses.get() + "classes." , "Close"); + Notify_MT.Notify(activity, "Info", "Total replaced " + replacedCount.get() + " times in " + affectedClasses.get() + " classes." , "Close"); if (!errorClasses.isEmpty()) { showErrorDialog(activity); }