admin管理员组

文章数量:1290956

I have a jQuery function with a user input text variable sel. I display the variable like this:

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

Works fine.

If the variable begins or ends with any of these characters:

.,?!'"

I want to to strip those very characters. For example, if sel is:

'Hello world, josh's car.,'

I want to strip it to:

Hello world, josh's car

How do I do this in jQuery/javascript? Maybe regex?

I have a jQuery function with a user input text variable sel. I display the variable like this:

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

Works fine.

If the variable begins or ends with any of these characters:

.,?!'"

I want to to strip those very characters. For example, if sel is:

'Hello world, josh's car.,'

I want to strip it to:

Hello world, josh's car

How do I do this in jQuery/javascript? Maybe regex?

Share Improve this question asked Feb 13, 2016 at 12:52 Henrik PettersonHenrik Petterson 7,10421 gold badges80 silver badges157 bronze badges 0
Add a ment  | 

2 Answers 2

Reset to default 12 +50

You can use String#replace with RegEx

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

RegEx Explanation:

  1. ^: Starts of the line anchor
  2. $: End of the line anchor
  3. [.,?!'"]+: Match any of the characters in the character class [ and ] that occur one or more times in any order
  4. |: OR condition/alteration in the RegEx
  5. g: Global flag

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>


From OP's ment

How do I adjust the regex so that it removes characters if the variable ends with 's? For example, if the variable is John's, it will bee John

The RegEx can be modified a bit to match 's at the end of the string.

The character class can be make lazy/non-greedy and adding 's as optional group at the end of string.

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

Adding ? in [.,?!'"]*? will make the match lazy. (?:) is non-capturing group and adding ? in (?:'s)? will make the 's optional.

RegEx Demo

Or, as @Daniel Cheung said in the ment, you can also use

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

RegEx Demo

Update:

To remove spaces \s can be added in the character class. Or String#trim can also be used after `replace.

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

RegEx Demo


As stated in ment by @Casimir et Hippolyte, you can use ^[\W_]+|[\W_]+$ to remove all the special characters at the beginning and end of the string.

I'd prefer a no regex solution simply because the decision "tree" within regex engines is much bigger. and especially because the regexes used for trimming contain query characters which lead to backtracking within the regex engine. such engines often pile the pattern into byte-code, resembling machine instructions. the engine then executes the code, jumping from instruction to instruction. when an instruction fails, it then back-tracks to find another way to match the input. ergo a lot more going on than necessary.

Here is a solution that I personally find more readable and is faster.

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

本文标签: javascriptIf text begins or ends with these charactersremove charactersStack Overflow