【发布时间】:2015-06-29 05:30:31
【问题描述】:
我想在 JavaScript 中做一个不区分大小写的字符串全部替换,而不使用正则表达式(或在调用 replace 方法时使用正则表达式样式的字符串)。我找不到这个问题或答案,但如果我错过了,请链接它。
例如,将“abc”替换为“x”:
Find aBc&def stuff ABCabc 变为 Find x&def stuff xx
结果应保留未替换部分的原始大小写。
字符串中可能包含特殊字符,所以这就是我避免使用正则表达式的原因。我的特殊问题可能可以通过正则表达式解决,但我有兴趣完全避免它。
有几个问题和答案使用正则表达式,包括特殊字符的处理。特别是,bobince 的回答 https://stackoverflow.com/a/280837/292060 描述了如果不知道或根据原始字符串中的特定条件采取行动,这是不可能的。
我认为这将涉及循环和 indexOf,并遍历原始字符串,构建结果。
为了这个问题,假设性能不是主要问题。例如,循环字符是可以的。
有一些现有问题包括所有答案的正则表达式:
- Case insensitive string replacement in JavaScript?
- javascript replace all with case insensitive and keeping correct case in original string
- Case insensitive replace all
编辑:
从一些答案,一些澄清 - 我最初没有指定这些,但它们是典型的搜索/替换行为:
可以替换为相同的字符串,例如,将 'abc' 替换为 'Abc',例如修复名称的标题大小写。
不应重新检查替换,例如,将 'ab' 替换为 'abc' 应该可以。例如,将 abcc 中的 'abc' 替换为 'ab' 变为 abc 而不是 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".
【问题讨论】:
-
到目前为止的答案很好,我想在选择答案之前先尝试一下。我想确保索引替换不同大小的替换。还有是否应该“重新检查”替换(可能不是,因为这在搜索/替换中并不常见)。
-
如果我理解正确为什么您不想使用正则表达式(因为用户可以输入可能包含正则表达式字符的 anhthing),您可能会转义正则表达式字符。我知道 jquery-ui 在它的自动完成功能中做到了这一点。
-
这主要来自 bobince 的回答stackoverflow.com/a/280837/292060 的讨论。这将是用户对搜索引擎的广泛输入,我无法就哪些字符可以允许,哪些字符不能达成共识。所以我只是想避开它。
-
好吧,我继续制作了一个交互式版本,这样您就可以尝试一堆不同的字符串。它使用 indexOf 方法和转义的正则表达式替换向您显示结果。正则表达式代码稍微简单一些,但这将有助于查看您是否可以破解它。
-
我去看看,谢谢。它可能“只是”一种练习,但它是一个很好的练习。
标签: javascript string replace case-insensitive