我有一个带有用户输入文本变量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中执行此操作?也许正则表达式?
答案 0 :(得分:10)
您可以将String#replace
与RegEx
var regex = /^[.,?!'"]+|[.,?!'"]+$/g;
text = text.replace(regex, '');
RegEx说明:
^
:行anchor $
:行尾anchor [.,?!'"]+
:匹配character class [
和]
中按任意顺序出现一次或多次的任何字符|
:OR condition/alteration在RegEx g
:全球旗帜
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
成为可选项。
或者,正如@Daniel Cheung中comment所述,您也可以使用
/^[.,?!'"]+|(?:[.,?!'"]|'s)+$/
<强>更新强>
删除空格\s
可以添加到字符类中。或者在{replace。
String#trim
/^[.,?!'"\s]+|[.,?!'"\s]+$/
^^ ^^
正如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);