I am trying to use JavaScript's string replace method to remove any characters or words from user input that do not match a set of words or codes within a custom pattern. For example, if I have I have a pattern %PT!!@@ and the input %PT1234!!test@@, I want to remove anything that doesn't match '%PT', '!!' and '@@'. This means '1234' and 'test' will be removed from the string. I have seen similar questions using the regular expression like (?!(%PT|!!|@@)) but this doesn't work.
            Asked
            
        
        
            Active
            
        
            Viewed 63 times
        
    0
            
            
         
    
    
        Wiktor Stribiżew
        
- 607,720
- 39
- 448
- 563
 
    
    
        dan
        
- 39
- 1
- 7
- 
                    What are you trying to accomplish in plain words not regex? Since your regex you know is buggy, plain words will help to debug? – GetSet Apr 03 '20 at 10:59
- 
                    I want to remove any words or characters that don't match '%PT', '!!' or '@@'. If I do '%PT1234!!test@@''.replace(regex,''), I would have %PT!!@@ as the result. – dan Apr 03 '20 at 11:04
- 
                    Can you give a real world example? Otherwise removing makes no sense if it has a definite value you want. – GetSet Apr 03 '20 at 11:10
- 
                    How do you know that pattern should be `(%PT|!!|@@)` and not `(%PT!|!@@)` or `(%P|T!!@|@)`? – user2316116 Apr 03 '20 at 13:59
- 
                    the pattern can be dynamic as it is defined by a user. I just used %PT!!@@ as an example – dan Apr 03 '20 at 16:01
2 Answers
1
            
            
        So, you have a %PT1234!!test@@ string and you need to remove any text that doesn't match %PT, !! and @@ substrings.
You may capture these strings (or patterns) that you want to keep and just match everything else. Then, replace with the backreference to Group 1 to restore that value in the result.
Or, you may simple match what you need to get, and then join the found values.
See the JS demo:
console.log(
  "%PT1234!!test@@".replace(/(%PT|!!|@@)|[\s\S]/g, '$1')
) // => %PT!!@@
console.log(
  "%PT1234!!test@@".match(/%PT|!!|@@/g).join("")
) // => %PT!!@@See the regex demo online.
Details
- (%PT|!!|@@)- Capturing group 1: any of the values listed:- %PT,- !!or- @@
- |- or
- [\s\S]- any char.
 
    
    
        Wiktor Stribiżew
        
- 607,720
- 39
- 448
- 563
- 
                    The .match() function is great! Don't know why I didn't think of doing it that way. I think I was concentrating too much on the regular expression itself and removing values I didn't want rather than utilise the methods on the regex to capture the characters that did match the regex. Thanks for this, really appreciate it! – dan Apr 03 '20 at 12:15
- 
                    
- 
                    1@CarySwoveland As usual, [to match any chars including line break chars](https://stackoverflow.com/a/45981809/3832970). – Wiktor Stribiżew Apr 03 '20 at 20:33
0
            
            
        For your use case, you can use this regular expression: /[^%PT!{2}@{2}]/g
Quick example: https://jsfiddle.net/mzsavre5/
 
    
    
        GoranLegenda
        
- 491
- 3
- 9