2016-12-08 2 views
2

я должен разрешить все буквы (включая акцентами) = \w.NET RegEx буквы/знаки/пробелы

Я должен позволить пространства = \s

У меня есть, чтобы определенные признаки = [\-\/\.\;\\\,\:\+\(\)]

Единственное ограничение состоит в том, что эти знаки могут отображаться максимум 3 раза в полной строке.

На данный момент у меня есть это регулярное выражение

^\w*([\-\/\.\;\\\,\:\+\(\)\s]{0,3}\w*){0,2}?$

Но это ограничивает все до определенной точки. Может ли кто-нибудь поддержать меня, чтобы создать правильное регулярное выражение?

ответ

2

Кажется, вам не нужно \w, вам нужно \p{L}, чтобы соответствовать толькописьма. Обратите внимание, что \w соответствует [\p{L}\p{N}_] и поэтому не подходит для этого сценария.

Объединить все в 1 узор - ^[-\p{L}\s/.;\\,:+()]+$ - и ограничить его с (?!(?:[^-/.;\\,:+()]*[-/.;\\,:+()]){4}) отрицательного предпросмотра на якорь в начале запрещая 4 непоследовательных вхождения этих специальных символов (так, что позволяет 0-3 случаев):

\A(?!(?:[^-/.;\\,:+()]*[-/.;\\,:+()]){4})[-\p{L}\s/.;\\,:+()]+\z 

См regex demo

  • \A - начало строки
  • (?!(?:[^-/.;\\,:+()]*[-/.;\\,:+()]){4}) - отрицательный предпросмотр, который не мат ч, если ее шаблон соответствует:
    • (?:[^-/.;\\,:+()]*[-/.;\\,:+()]){4} - 4 последовательности:
      • [^-/.;\\,:+()]* - ноль или больше символов, отличные от тех, которые определены в наборе
      • [-/.;\\,:+()] - 1 символ определен в наборе
  • [-\p{L}\s/.;\\,:+()]+ - 1 или более символов, определенных в классе символов
  • \z - самый конец строки.

C# декларация с помощью дословного строкового литерала:

var pattern = @"\A(?!(?:[^-/.;\\,:+()]*[-/.;\\,:+()]){4})[-\p{L}\s/.;\\,:+()]+\z"; 

Другой подход: использовать не-захвата группы и применить {0,3} предельную квантор к нему:

\A[\p{L}\s]*(?:[-/.;\\,:+()][\p{L}\s]*){0,3}[\p{L}\s]*\z 

См another regex demo. Обратите внимание, что это выражение также будет соответствовать пустой строке, чтобы предотвратить ее, замените первый или последний [\p{L}\s]* на [\p{L}\s]+.

  • [\p{L}\s]* - соответствует 0+ письмо или пробельные символы
  • (?:[-/.;\\,:+()][\w\s]*){0,3} - от 0 до 3 вхождений:
    • [-/.;\\,:+()] - 1 знак из набора
    • [\p{L}\s]* - 0+ буквы или пробельные символы
  • [\p{L}\s]* - соответствует 0 + слова или пробельные символы
+0

Спасибо за ваш ответ! Последнее обновление кажется мне более понятным. Есть ли способ сбрасывать цифры? Потому что \ w также допускает цифры (которые я раньше не замечал). Еще раз спасибо за усилия и объяснения! – Senne

+0

Ну, '\ w' соответствует' [\ p {L} \ p {N} _] '. Просто замените '\ w' тем, что вам нужно:' [\ p {L} _] ', если вам также нужны символы подчеркивания или просто' \ p {L} 'для соответствия буквам. –

+0

Хорошо, еще раз спасибо, очень полезно! – Senne