如果文本以这些字符开头或结尾,请删除字符

时间:2016-02-13 12:52:01

标签: javascript jquery regex

我有一个带有用户输入文本变量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中执行此操作?也许正则表达式?

2 个答案:

答案 0 :(得分:10)

您可以将String#replace与RegEx

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

RegEx说明:

  1. ^:行anchor
  2. 的开头
  3. $:行尾anchor
  4. [.,?!'"]+:匹配character class []中按任意顺序出现一次或多次的任何字符
  5. |OR condition/alteration在RegEx
  6. g:全球旗帜
  7. 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的,它将变为 John

    RegEx可以稍微修改一下,以匹配字符串末尾的's

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

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

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

    RegEx Demo

    或者,正如@Daniel Cheungcomment所述,您也可以使用

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

    RegEx Demo

    <强>更新

    删除空格\s可以添加到字符类中。或者在{replace。

    之后也可以使用String#trim
    /^[.,?!'"\s]+|[.,?!'"\s]+$/
             ^^          ^^
    

    RegEx Demo

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

答案 1 :(得分:0)

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

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

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);