不使用正则表达式的JavaScript中不区分大小写的字符串全部替换

善眼

我想在JavaScript中不区分大小写的字符串全部替换而不使用正则表达式(或在replace方法的调用中使用正则表达式样式的字符串)。我找不到与此相关的问题或答案,但是如果错过了,请链接。

例如,在以下位置将“ abc”替换为“ x”:

Find aBc&def stuff ABCabc 变成 Find x&def stuff xx

结果应保留未替换部分的原始情况。

该字符串中可能包含特殊字符,因此这就是为什么我要避免使用正则表达式的原因。我的特殊问题可以使用正则表达式解决,但我有兴趣完全避免使用正则表达式。

有一些使用正则表达式的问题和答案,包括特殊字符的处理。特别是,bobince在这里的答案https://stackoverflow.com/a/280837/292060描述了在不知道原始字符串的特定条件或不根据其在特定条件下采取行动的情况下如何不可能。

我认为这将涉及一个循环和indexOf,并遍历原始字符串,从而生成结果。

出于这个问题,我们可以说性能不是主要问题。例如,循环字符是可以的。

有一些现有问题,包括所有答案的正则表达式:

编辑:
从一些答案,一些澄清-我最初没有指定这些,但是它们是典型的搜索/替换行为:

可以用相同的字符串替换,例如,用'Abc'替换'abc',例如修复名称的标题大小写。

不应重新检查替换项,例如,用“ abc”替换“ ab”应该可以。例如,用'ab'代替'abc'abcc变为abcnot ab

我认为应该归结为替换,然后继续进行操作,而不必“回头”。

编辑:这是一些测试用例,仅供记录。我没有遇到空字符串等问题,这些字符串也应该经过测试。https://jsfiddle.net/k364st09/1/

("Find aBc&def abc", "abc", "xy")   - Find xy&def xy - general test
("Find aBc&def abc", "abc", "ABC")  - Find ABC&def ABC - replace same test, avoid infinite loop
("Find aBcc&def abc", "abc", "ab")  - Find abc&def ab - "move on" avoid double checking (fails if abcc becomes ab)
("abc def", "abc", "xy")            - xy def - Don't drop last characters.
("abcc def", "abc", "xy")           - xyc def  - Just a mix of "move on" and "don't drop last".
Redbmk
  1. 从一个空字符串开始,然后复制原始字符串。
  2. 查找要在副本中替换的字符串的索引(将它们都设置为小写会使搜索不区分大小写)。
  3. 如果不在副本中,请跳至步骤7。
  4. 添加从副本到索引的所有内容,再加上替换内容。
  5. 将副本修剪到要替换的零件之后的所有内容。
  6. 返回步骤2。
  7. 添加副本的剩余内容。

只是为了好玩,我创建了一个交互式版本,您可以在其中查看正则表达式和indexOf的结果,以了解转义正则表达式是否会破坏任何内容。用来转义我从jQuery UI中获取的正则表达式的方法。如果您将其包含在页面中,则可以使用找到$.ui.autocomplete.escapeRegex否则,这是一个很小的功能。

这是非正则表达式函数,但是由于交互部分添加了更多代码,因此默认情况下隐藏了完整的代码片段。

function insensitiveReplaceAll(original, find, replace) {
  var str = "",
    remainder = original,
    lowFind = find.toLowerCase(),
    idx;

  while ((idx = remainder.toLowerCase().indexOf(lowFind)) !== -1) {
    str += remainder.substr(0, idx) + replace;

    remainder = remainder.substr(idx + find.length);
  }

  return str + remainder;
}

// example call:
insensitiveReplaceAll("Find aBcc&def stuff ABCabc", "abc", "ab");

function insensitiveReplaceAll(original, find, replace) {
  var str = "",
    remainder = original,
    lowFind = find.toLowerCase(),
    idx;

  while ((idx = remainder.toLowerCase().indexOf(lowFind)) !== -1) {
    str += remainder.substr(0, idx) + replace;

    remainder = remainder.substr(idx + find.length);
  }

  return str + remainder;
}

function escapeRegex(value) {
  return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
}

function updateResult() {
  var original = document.getElementById("original").value || "",
    find = document.getElementById("find").value || "",
    replace = document.getElementById("replace").value || "",
    resultEl = document.getElementById("result"),
    regexEl = document.getElementById("regex");

  if (original && find && replace) {
    regexEl.value = original.replace(new RegExp(escapeRegex(find), "gi"), replace);
    resultEl.value = insensitiveReplaceAll(original, find, replace);
  } else {
    regexEl.value = "";
    resultEl.value = "";
  }


}

document.addEventListener("input", updateResult);
window.addEventListener("load", updateResult);
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet" />

<div class="input-group input-group-sm">
  <span class="input-group-addon">Original</span>
  <input class="form-control" id="original" value="Find aBcc&def stuff ABCabc" />
</div>

<div class="input-group input-group-sm">
  <span class="input-group-addon">Find</span>
  <input class="form-control" id="find" value="abc" />
</div>

<div class="input-group input-group-sm">
  <span class="input-group-addon">Replace</span>
  <input class="form-control" id="replace" value="ab" />
</div>

<div class="input-group input-group-sm">
  <span class="input-group-addon">Result w/o regex</span>
  <input disabled class="form-control" id="result" />
</div>

<div class="input-group input-group-sm">
  <span class="input-group-addon">Result w/ regex</span>
  <input disabled class="form-control" id="regex" />
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

javascript从字符串创建不区分大小写的正则表达式

来自分类Dev

用区分大小写的字符串替换正则表达式

来自分类Dev

JavaScript正则表达式(?i)选项中字符串不区分大小写的一部分不起作用

来自分类Dev

正则表达式匹配不包含substr且不区分大小写的字符串

来自分类Dev

使用正则表达式更改字符串中的字母大小写

来自分类Dev

使用正则表达式更改字符串中的字母大小写

来自分类Dev

C#正则表达式匹配不包含特定字符串的不区分大小写的字符串

来自分类Dev

检查一个字符串是否包含另一个字符串的全部或3个连续字符?正则表达式python不区分大小写

来自分类Dev

正则表达式替换python中的字符串但保持大小写的最佳方法是什么?

来自分类Dev

使用正则表达式查找未知字符串并更改Java中的大小写

来自分类Dev

使javascript正则表达式不区分大小写

来自分类Dev

如何创建不区分大小写的正则表达式?(javascript)

来自分类Dev

Neo4j不区分大小写的正则表达式搜索中某些特殊字符的大小写似乎不匹配

来自分类Dev

XSD中不区分大小写的正则表达式

来自分类Dev

Neo4j不区分大小写的正则表达式中的符号

来自分类Dev

从正则表达式中获取不区分大小写的单词

来自分类Dev

PostgreSQL查询中的正则表达式不区分大小写

来自分类Dev

LINQ中不区分大小写的LIKE条件(带有正则表达式)

来自分类Dev

从正则表达式中获取不区分大小写的单词

来自分类Dev

正则表达式中不区分大小写的搜索

来自分类Dev

如何使用Regexp.union构建不区分大小写的正则表达式

来自分类Dev

是的,使用正则表达式和不区分大小写的验证

来自分类Dev

正则表达式-如何使表达式不区分大小写?

来自分类Dev

如何用发现的不区分大小写的正则表达式替换匹配项,但扩展结果

来自分类Dev

正则表达式区分大小写关闭

来自分类Dev

强制正则表达式区分大小写?

来自分类Dev

想要使用JavaScript正则表达式来替换大小写

来自分类Dev

从JavaScript中的字符串中替换数组中的值,不区分大小写

来自分类Dev

在netezza中不使用正则表达式替换字符串

Related 相关文章

  1. 1

    javascript从字符串创建不区分大小写的正则表达式

  2. 2

    用区分大小写的字符串替换正则表达式

  3. 3

    JavaScript正则表达式(?i)选项中字符串不区分大小写的一部分不起作用

  4. 4

    正则表达式匹配不包含substr且不区分大小写的字符串

  5. 5

    使用正则表达式更改字符串中的字母大小写

  6. 6

    使用正则表达式更改字符串中的字母大小写

  7. 7

    C#正则表达式匹配不包含特定字符串的不区分大小写的字符串

  8. 8

    检查一个字符串是否包含另一个字符串的全部或3个连续字符?正则表达式python不区分大小写

  9. 9

    正则表达式替换python中的字符串但保持大小写的最佳方法是什么?

  10. 10

    使用正则表达式查找未知字符串并更改Java中的大小写

  11. 11

    使javascript正则表达式不区分大小写

  12. 12

    如何创建不区分大小写的正则表达式?(javascript)

  13. 13

    Neo4j不区分大小写的正则表达式搜索中某些特殊字符的大小写似乎不匹配

  14. 14

    XSD中不区分大小写的正则表达式

  15. 15

    Neo4j不区分大小写的正则表达式中的符号

  16. 16

    从正则表达式中获取不区分大小写的单词

  17. 17

    PostgreSQL查询中的正则表达式不区分大小写

  18. 18

    LINQ中不区分大小写的LIKE条件(带有正则表达式)

  19. 19

    从正则表达式中获取不区分大小写的单词

  20. 20

    正则表达式中不区分大小写的搜索

  21. 21

    如何使用Regexp.union构建不区分大小写的正则表达式

  22. 22

    是的,使用正则表达式和不区分大小写的验证

  23. 23

    正则表达式-如何使表达式不区分大小写?

  24. 24

    如何用发现的不区分大小写的正则表达式替换匹配项,但扩展结果

  25. 25

    正则表达式区分大小写关闭

  26. 26

    强制正则表达式区分大小写?

  27. 27

    想要使用JavaScript正则表达式来替换大小写

  28. 28

    从JavaScript中的字符串中替换数组中的值,不区分大小写

  29. 29

    在netezza中不使用正则表达式替换字符串

热门标签

归档