【问题标题】:Javascript substring check using indexOf or search on a date string with forward slash /Javascript 子字符串检查使用 indexOf 或搜索带有正斜杠 / 的日期字符串
【发布时间】:2025-12-04 19:35:01
【问题描述】:

我很惊讶没有找到任何关于此的帖子,我一定错过了一些非常微不足道的东西。我有一个小的 JavaScript 函数来检查字符串是否与对象的属性匹配。简单的东西对吗?除了包含正斜杠的字符串之外,它可以轻松处理所有字符串。

"‎04‎/‎08‎/‎2015‎".indexOf('4') // returns 2 :good
"‎04‎/‎08‎/‎2015‎".indexOf('4/') // returns -1 :why?

同样的问题似乎也出现在 .search() 函数中。我在处理日期字符串时遇到了这个问题。

请注意,出于性能原因,我不想使用基于正则表达式的解决方案。提前感谢您的帮助!

【问题讨论】:

    标签: javascript string date


    【解决方案1】:

    您的字符串中包含不可见的 Unicode 字符。 “从左到右的标记”(十六进制 200E)出现在两个斜线字符周围以及字符串的开头和结尾。

    如果您在浏览器控制台上键入代码而不是剪切和粘贴,您会看到它按预期工作。

    【讨论】:

    • 有趣的是,我确实将粘贴的字符串复制到 VisualStudio 控制台窗口中。我检查了我是否在控制台上键入了字符串,例如“04/”.indexOf('4/'),然后它给出了正确的结果。那我该如何克服这个问题呢?我有一个 Date() 对象,我在该对象上调用 date.toLocaleString()。我不想在这个字符串上搜索子字符串。您是否建议摆脱在我使用 indexOf() 方法之前生成的不可见 unicode 字符?
    • @lawc 哪个平台会为您提供一个包含这些字符的字符串作为来自.toLocaleString() 的返回值?你在哪个地区?我的浏览器没有给我任何类似的特殊字符(en_US)。
    • 我在 Windows 平台上,我的语言环境是 en-GB。
    • @lawc 很奇怪。好吧,您可以使用date.toLocaleString().replace(/\u200E/g, "") 删除不可见的字符。
    • 我可以确认替换 unicode 字符后按预期工作。但是,如果它成为开销,我会使用 .replace() 。我的方法将在每次键盘敲击时调用,因为它是搜索过滤器功能的一部分。我会接受您的回答,因为它解决了原始问题,谢谢。但我将不胜感激任何进一步的建议,以提高包含此类不可见 unicode 字符的字符串的子字符串搜索性能。