【问题标题】:If text begins or ends with these characters, remove characters如果文本以这些字符开头或结尾,请删除字符
【发布时间】:2016-02-13 12:52:00
【问题描述】:

我有一个带有用户输入文本变量sel 的jQuery 函数。我这样显示变量:

jQuery(this).parent().prev().find('.js-trigger-add-tag-target').text(sel);

工作正常。

如果变量开始结束以下列任何字符:

.,?!'"

我想去掉那些字符。例如,如果sel 是:

'Hello world, josh's car.,'

我想把它剥离成:

Hello world, josh's car

如何在 jQuery/javascript 中执行此操作?也许是正则表达式?

【问题讨论】:

    标签: javascript jquery regex


    【解决方案1】:

    您可以将String#replace 与正则表达式一起使用

    var regex = /^[.,?!'"]+|[.,?!'"]+$/g;
    text = text.replace(regex, '');
    

    正则表达式解释:

    1. ^:行首anchor
    2. $:行​​尾anchor
    3. [.,?!'"]+:匹配character class [] 中以任意顺序出现一次或多次的任意字符
    4. |: 正则表达式中的OR condition/alteration
    5. g: 全局标志

    RegEx101 Live Demo

    var regex = /^[.,?!'"]+|[.,?!'"]+$/g; // Note that you don't need `m` flag here
    
    var resultEl = document.getElementById('output');
    document.getElementById('myInput').addEventListener('keyup', function() {
      resultEl.innerHTML = this.value.replace(regex, '');
    }, false);
    <input type="text" id="myInput" placeholder="Type something" />
    
    <div id="output">You'll see output here</div>

    来自 OP 的comment

    如果变量以's 结尾,如何调整正则表达式以删除字符?例如,如果变量是 John's,它将变为 John

    可以稍微修改正则表达式以匹配字符串末尾的's

    字符类可以设为惰性/非贪婪,并在字符串末尾添加's 作为可选组。

    /^[.,?!'"]+|[.,?!'"]*?(?:'s)?$/
    

    [.,?!'"]*? 中添加? 将匹配lazy(?:)non-capturing group 并在 (?:'s)? 中添加 ? 将使 's 可选。

    RegEx Demo

    或者,正如@Daniel Cheungcomment中所说,你也可以使用

    /^[.,?!'"]+|(?:[.,?!'"]|'s)+$/
    

    RegEx Demo

    更新:

    要删除空格\s 可以在字符类中添加。或者String#trim也可以在`replace之后使用。

    /^[.,?!'"\s]+|[.,?!'"\s]+$/
             ^^          ^^
    

    RegEx Demo


    正如@Casimir et Hippolytecomment 中所说,您可以使用^[\W_]+|[\W_]+$删除字符串开头和结尾的所有特殊字符

    【讨论】:

    • 非常不错!我有个问题。如果变量以 's 结尾,如何调整正则表达式以删除字符?例如,如果变量是 John's,它将变为 John
    • @HenrikPetterson ^[.,?!'"]+|(?:[.,?!'"]|'s)+$
    • 这很棒。我会接受这个答案并赏金 50 分!最后一个问题。如果文本在结尾或开头有空格,则它不起作用。您可以调整正则表达式以忽略开头或结尾的空格吗?
    • @HenrikPetterson 您只需在字符类中添加\s^[.,?!'"\s]+|[.,?!'"\s]+$
    • @CasimiretHippolyte 如果 OP 想要删除除 _ 之外的所有特殊字符,可以这样做。正如 OP 已说明要删除的字符,我认为最好只删除这些字符。
    【解决方案2】:

    我更喜欢没有正则表达式的解决方案,因为正则表达式引擎中的决策“树”要大得多。特别是因为用于修剪的正则表达式包含导致正则表达式引擎内回溯的查询字符。此类引擎通常将模式编译成字节码,类似于机器指令。然后引擎执行代码,从一条指令跳到另一条指令。当一条指令失败时,它会回溯以找到另一种匹配输入的方法。因此,发生的事情比必要的要多得多。

    这是我个人认为更具可读性且速度更快的解决方案。

    function trimByChars(string, characters) {
      const first = [...string].findIndex(char => !characters.includes(char));
      const last = [...string].reverse().findIndex(char => !characters.includes(char));
      return string.substring(first, string.length - last);
    }
    const chars = ["'", '"', ',', '?', '!', '.'];
    trimByChars("'Hello world, josh's car.,'", chars);
    

    【讨论】:

      猜你喜欢
      • 2021-04-25
      • 2012-06-13
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多