Assuming your input is name then you can just exclude those special characters, use the every function on pattern, basically check that each pattern is true otherwise throw an error message that you can override as you prefer
<label htmlFor="name">Name</label>
<input
type="text"
name="name"
id="name"
ref={register({
required: "required",
maxLength: {
value: 15,
message: "must be max 15 chars",
},
validate: (value) => {
return (
[/[a-z]/, /[A-Z]/, /[0-9]/].every((pattern) =>
pattern.test(value)
) || "cannot special chars, only lower, upper, number"
);
},
})}
/>
{errors.email ? <div>{errors.email.message}</div> : null}
Or for example if your field is a password and you want that the user include at least a special character, then it would be like this:
<label htmlFor="password">Password</label>
<input
type="password"
name="password"
id="password"
ref={register({
required: "required",
minLength: {
value: 8,
message: "must be 8 chars",
},
validate: (value) => {
return (
[/[a-z]/, /[A-Z]/, /[0-9]/, /[^a-zA-Z0-9]/].every((pattern) =>
pattern.test(value)
) || "must include lower, upper, number, and special chars"
);
},
})}
/>
{errors.password ? <div>{errors.password.message}</div> : null}
</div>