【问题标题】:Filtering out all non-alphanumeric characters in JavaScript过滤掉 JavaScript 中的所有非字母数字字符
【发布时间】:2020-01-29 05:29:06
【问题描述】:

我正在尝试从字符串中过滤掉特定字符。我认为这不需要太多介绍,所以这里有一些例子。

const filt1 = "This will not be replaced: æ Ç ü";
const filt2 = "This will be replaced: » ↕ ◄";

// Output goal:
// filt1 = This will not be replaced: æ Ç ü
// filt2 = This will be replaced:   

我该怎么做呢?我想替换所有未在任何语言中使用的字符。
我想保留重音字符和中文字符之类的内容。
箭头、方块等应该被过滤掉。

我尝试了许多正则表达式过滤器,但没有一个能达到我想要的效果。 这个效果最好:

((?![a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇߨøÅ寿œ ]).)*

但它体积庞大,并且不包含非重音字母数字字符。
抱歉,如果这篇文章的措辞难以阅读。我已经有一段时间了,我的大脑功能不正常。

【问题讨论】:

  • 我认为没有任何算法可以确定您做什么和不想保留什么,因此唯一的方法是蛮力列出您想要保留在一个巨大的字符串/数组中的内容。你可以检查几十种语言的代码页,看看是否能找到任何基于字符代码的算法,但除非你将自己限制在几种语言,否则我怀疑你会找到算法捷径。
  • 这是我最初的想法,但它看起来很笨重。如上所示,很容易做到,但感觉效率不高。
  • 您是否检查了所有您关心的代码页并查看您想要保留的字符是否遵循其字符代码的某种模式?这是我看到的唯一可能。但是,如果你要学习中文,而不仅仅是浪漫语言,那就不太可能了。
  • @jfriend00 即使只包含西里尔字母也开始使其成为主要痛苦,添加中文、韩文、日文等将无法维护。
  • @VLAZ - 是的,我就是这么想的。我想我会回到真正的问题所在并寻找不同的方法。

标签: javascript node.js regex


【解决方案1】:

你可以试试 unicode 正则表达式/[^\p{L}\s]/ugi

console.log('This will be replaced: » ↕ ◄, This will not be replaced: æ Ç ü'.replace(/[^\p{L}\s]/ugi, ''));

Unicode property escapes 已在 ES2018 中添加,browser support 目前是有限的,node.js supports them 从版本 10 开始。

【讨论】:

  • 你能多解释一下正则表达式的作用,或者是一个阅读更多内容的链接
  • 这行得通;它做了我需要的一切。 +正如@joyBlanks 所说,有关其工作原理的更多信息会很棒。
  • @Edude42:我建议阅读答案中链接的 MDN 页面,但它似乎仍在进行中。 Unicode character properties 上的维基百科页面可能是对那里一些缺失信息的有用补充。
猜你喜欢
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多