【问题标题】:Replace superscript and subscript chars from a string Javascript从字符串Javascript替换上标和下标字符
【发布时间】:2017-07-18 09:42:44
【问题描述】:

我想从文本中删除所有上标和下标字符。

Exp:'⁰'.

我找到了example on stackoverflow,但它只考虑上标数字而不考虑字符或下标。

有谁知道如何做到这一点?一种方法是拥有所有可能的上标和下标并逐个替换它们,但这有点不切实际。

【问题讨论】:

标签: javascript regex superscript


【解决方案1】:

基于subscript and superscript Unicode range reference 和在UniView tool 中手动搜索“下标”和“上标”,您可以使用

.replace(/[\u006E\u00B0\u00B2\u00B3\u00B9\u02AF\u0670\u0711\u2121\u213B\u2207\u29B5\uFC5B-\uFC5D\uFC63\uFC90\uFCD9\u2070\u2071\u2074-\u208E\u2090-\u209C\u0345\u0656\u17D2\u1D62-\u1D6A\u2A27\u2C7C]+/g, '')

请参阅regex demo

+ 量词(一个或多个连续出现)将使正则表达式引擎更容易一次性删除 1+ 个子/上标字符的整个块。

注意ᵀᴹ修饰符,不是正式的上标字符。如果你想包含它们,你需要

var res = s.replace(/(?:\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F\uDFE0]|[\u006E\u00B0\u00B2\u00B3\u00B9\u02AF\u0670\u0711\u2121\u213B\u2207\u29B5\uFC5B-\uFC5D\uFC63\uFC90\uFCD9\u2070\u2071\u2074-\u208E\u2090-\u209C\u0345\u0656\u17D2\u1D62-\u1D6A\u2A27\u2C7C\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C\uA69D\uA717-\uA71F\uA770\uA788\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E\uFF9F])+/g, '')

this demo

为了规范下标和上标数字,使用字典并在作为替换参数传递的匿名方法中动态替换是有意义的:

var super_sub_script_dict = {'\u2070': '0', '\u00B9': '1', '\u00B2': '2', '\u00B3': '3', '\u2074': '4', '\u2075': '5', '\u2076': '6', '\u2077': '7', '\u2078': '8', '\u2079': '9', '\u2080': '0', '\u2081': '1', '\u2082': '2', '\u2083': '3', '\u2084': '4', '\u2085': '5', '\u2086': '6', '\u2087': '7', '\u2088': '8', '\u2089': '9'};
var test_string = "Subscript: ₀₁₂₃₄₅₆₇₈₉ and superscript: ⁰¹²³⁴⁵⁶⁷⁸⁹";
var regex = new RegExp('[' + Object.keys(super_sub_script_dict).join("") + ']', 'g'); // => /[⁰¹²³⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉]/g
// Or
// var regex = /[\u00B9\u00B2\u00B3\u2070\u2074-\u2089]/g;
console.log(test_string.replace(regex, function(x) { 
    return super_sub_script_dict[x];
}))

【讨论】:

  • 这似乎不起作用。我尝试了 "ᵀᴹ".replace(/[\u2070\u2071\u2074-\u208E\u2090-\u209C]+/gi, '') 和 "¹²³".replace(/[\u2070\u2071\u2074-\ u208E\u2090-\u209C]+/g, '') 并没有被替换。顺便说一句,谢谢你的帮助
  • 那些ᵀᴹ 是修饰字母。你也想匹配这样的修饰符吗?
  • 上标或下标中的所有内容都导致我的工作应用出现问题,我想删除所有内容。请注意,即使“¹²³”也没有从您发布的正则表达式中替换。我在 chrome 控制台上测试过
  • 我用 2 个变体更新了答案:一个包含 Unicode 名称包含“下标”/“上标”单词的字符,第二个解决方案除了第一个模式之外还匹配修饰符字母。
  • @MSD 我添加了一个代码 sn-p 显示如何规范化下标和上标数字。
猜你喜欢
  • 2020-01-20
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
相关资源
最近更新 更多