Regex, чтобы поймать любую не-букву, не-номер, не-пространство

Я пытаюсь разрешить только буквы и пробелы.

нет. _ ! ~ `

и любой другой специальный символ (я знаю, что _ должен быть буквой.. я просто не хочу этого)

мой вопрос: как я должен это писать?

в основном ive нашел ответы, которые указали символы, которые являются «незаконными», как:

^[^$&+,:;=?@}{#|'<>/.^*()%!][~`_-]+[^$&+,:;=?@}{#|'<>/.^*()%!][~`_-]*$

но мне было интересно, есть ли лучший способ сделать это, как :

^[a-zA-Z0-9s]+[a-zA-z0-9s]*$

проблема с этим заключается в том, что если символы []^``_после буквы / числа / пространства его все еще проходит через

[]`^_    <<this will be illegal
1[]`^_    <<this will not be caught as illegal

Я также пытался:^[wds]+[wds]*$

but it lets _ go through

редактировать
у меня была опечатка во втором коде (A-z), поэтому изменил его на

^[a-zA-Z0-9s]+[a-zA-Z0-9s]*$

и это прекрасно работает

так что лучше писать так, а не вводить everysingle special chatacter (как первый код)?
есть ли возможные символы, которые могли бы проскользнуть мимо этой проверки?

2 ответа

  1. Должно работать следующее (исправленная / упрощенная версия вашего примера выше)

    Если вы хотите включить все буквы (верхнюю или нижнюю) и любое число и только пробел:

    ^[a-zA-Z0-9 ]+$
    

    Если вы хотите любой пробел:

    ^[a-zA-Z0-9\s]+$
    
  2. Если я хорошо понял ваш вопрос, вы можете использовать отрицаемый класс символов для этого. Например, сопоставьте все символы, которые не являются буквами:

    [^A-Za-z]+
    

    Якоря можно использовать для сопоставления строк, содержащих только буквы

    ^[^A-Za-z]+$
    

    Если вы считаете пробелы ( \s) допустимыми, просто добавьте его в класс символов:

    ^[^A-Za-z\s]+$
    

    Связанный с» лучшим » подходом, вы можете сравнить производительность наверняка, но что лучший способ, если производительность не оказывает большого влияния, imho является наиболее читаемым выражением.