【问题标题】:how to find private char utf8 in a text?如何在文本中找到私有字符 utf8?
【发布时间】:2020-10-20 23:43:30
【问题描述】:

在 UTF-8 编码表和 Unicode 字符中,我使用补充私人使用区域,因为我确信它们不会用于任何文本中的单个字符。 事实是现在我需要在文本中找到它们。这是一个基本示例:

\u{f0001} hahrehr \u{f0002} eryteryte \u{f0003}\n yfukguk\u{f0004}\nggikggk

你可以看到 \u{f...} 是我的特殊字符。 如果我们 console.log 这个文本:

console.log("\u{f0001} hahrehr \u{f0002} eryteryte \u{f0003}\n yfukguk\u{f0004}\nggikggk</");

现在我需要一些东西来找到所有这些特殊字符。我想到了一个正则表达式,但我不知道如何处理 \u{f...} 的解释不同这一事实。

我知道我的问题不是很清楚,但我有任何可以帮助我的想法。

【问题讨论】:

标签: javascript regex


【解决方案1】:

three private use areas:

  • 基本多语言平面中的一个,\uE000-\uF8FF
  • Plane 15\u{F0000}-\u{FFFFD}
  • Plane 16, \u{100000}-\u{10FFFD}.

你可以使用

/[\uE000-\uF8FF\u{F0000}-\u{FFFFD}\u{100000}-\u{10FFFD}]/gu

用符合 ES6 的正则表达式匹配所有出现的这些字符。

请参阅 Regex modifier /u in JavaScript? 以了解有关 u 修饰符的更多信息。这里需要支持\u{XXXXX}符号。

符合 ES5 的模式是

/(?:[\uE000-\uF8FF]|[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD])/g

要获得匹配的代码点的十六进制代码数组,请使用一些额外的 JavaScript 代码:

const str = "\u{f0001} hahrehr \u{f0002} eryteryte \u{f0003}\n yfukguk\u{f0004}\nggikggk</";
const regex = /[\uE000-\uF8FF\u{F0000}-\u{FFFFD}\u{100000}-\u{10FFFD}]/gu;
console.log(
  str.match(regex).map(x => Array.from(x)
    .map((v) => v.codePointAt(0).toString(16))
    .map((hex) => "0000".substring(0, 4 - hex.length) + hex))
);

【讨论】:

  • 您可能想指出u 标志的重要性。
  • 应该 .match(/[{0001}-{ffff}]/ug);只能获取每个 \u{f...} char 的数量?
  • @Esposito 不,您不要这样做。如果您需要获取十六进制代码,则需要使用一些额外的逻辑来处理匹配。
  • 是的,我知道,我尝试过类似的事情:var match = text.match(/[\u{10000}-\u{fffff}]/ug);var match2 = match[0].match(/[{10000}-{fffff}]/ug); 但它再次不起作用,因为他尝试匹配私有字符而不是字符串
  • @Esposito 你在找match.map(m =&gt; m.codePointAt(0))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 2019-11-06
相关资源
最近更新 更多