Here's another idea. I checked this in LWC component reference, and it works.
Template
<template>
{has}
<div class="slds-m-top_medium slds-m-bottom_x-large">
<lightning-input type="text" onchange={check} label="Enter some text"></lightning-input>
</div>
</template>
JS
import { LightningElement } from 'lwc';
export default class InputText extends LightningElement {
has = false;
check({detail}) {
const value = detail.value
this.has = /[-!$%^&*()_+|~=`{}\[\]:";\'<>?,.\/]+/.test(value);
}
}
The difference is how I define RegExp. Not sure why this works and yours don't, digging into this. WIll update the answer once find out.
const regexp = /[-!$%^&*()_+|~=`{}\[\]:";\'<>?,.\/]+/
instead of
const regexp = new RegExp('[-!$%^&*()_+|~=`{}\[\]:";\'<>?,.\/]');
Also, I tried your way in a NodeJS REPL and it doesn't work either. SO it's not an LWC thing
Update
There's a problem with your RegExp. You should escape backslashes, which escape other characters. So you need to have the RegExp constructed the following way
new RegExp('[-!$%^&*()_+|~=`{}\\[\\]:";\\\'<>?,.\/]')
instead of
new RegExp('[-!$%^&*()_+|~=`{}\[\]:";\'<>?,.\/]')
I would recommend using a string expression instead of constructing a RegExp object
/[-!$%^&*()_+|~=`{}\[\]:";\'<>?,.\/]+/
For more information look here