Регулярное выражение .net для соответствия любому виду букв на любом языке. - PullRequest
9 голосов
/ 01 июня 2010

Какое регулярное выражение я могу использовать для сопоставления (разрешения) букв любого типа с любым языком

Мне нужно сопоставить любую букву, включая диакритические знаки (например, á, ü, ñ и т. Д.) и исключить любые символы (математические символы, знаки валюты, дингбаты, символы для рисования ящиков и т. д.) и знаки пунктуации.

Я использую asp.net MVC 2 с .net 4. Я пробовал эту аннотацию в моей модели представления:

[RegularExpression(@"\p{L}*", ...

и этот:

[RegularExpression(@"\p{L}\p{M}*", ...

но проверка на стороне клиента не работает.

UPDATE: Спасибо за все ваши ответы, ваши предложения работают, но только для .net, и проблема здесь в том, что он также использует регулярное выражение для проверки на стороне клиента с помощью JavaScript (извините, если это было недостаточно ясно). Я должен был пойти с:

[!?. ^ 0-9_ \ | ° ¬ # \ $% / \ () \ ¡¿+ {} []: \; @ ª ^ * <> = &] *

, который очень уродлив и не охватывает все сценарии, но является самым близким к тому, что мне нужно.

Ответы [ 8 ]

5 голосов
/ 01 июня 2010

Игнорируйте своего учителя грамматики и используйте двойные негативы:

[^\W\d_]

Помните, что \w соответствует любой букве, цифре или подчеркиванию, поэтому исключите их, как указано выше. Вы можете прочитать его как «не не-слово-символ, не цифра и не знак подчеркивания» - в котором остаются только буквы. Примените теорему Деморгана, и это имеет больше смысла: «слово-символ, но не цифра и не подчеркивание».

4 голосов
/ 01 июня 2010

Вы можете использовать Char.IsLetter:

Указывает, относится ли указанный символ Юникода к категории буквы Юникод.

С .Net 4.0:

string onlyLetters = String.Concat(str.Where(Char.IsLetter));

В 3.5 String.Concat исключается только массив, поэтому вам также следует вызвать ToArray.

2 голосов
/ 02 июня 2010

Ваша проблема, скорее всего, связана с тем, что вам понадобится только один альфа-символ, поскольку регулярное выражение будет соответствовать всему, что имеет хотя бы один символ.

Добавляя ^ в качестве префикса и $ в качестве постфикса, все предложение должно соответствовать вашему регулярному выражению. Так что этот пробник работает:

^\p{L}*$

Regexbuddy объясняет:

  1. ^ Утверждение позиции в начале строки
  2. \p{L} Символ со свойством Unicode 'буква' (любая буква любого языка) 2а. В промежутке от нуля до неограниченного количества раз (жадный)
  3. $ Утверждение позиции в конце строки
1 голос
/ 23 марта 2013

Мне просто нужно было проверить URL, и я выбрал это регулярное выражение в .NET.

^[(\p{L})?(\p{M})?-]*$

Начинайте и заканчивайте символами любого языка (необязательно, буквами или знаками) и разрешайте дефисы.

1 голос
/ 01 июня 2010

Стоит обратить внимание на регулярное выражение на стороне клиента. Он использует регулярные выражения javascript на стороне клиента и регулярные выражения .net на стороне сервера. Javascript не будет поддерживать этот сценарий.

1 голос
/ 01 июня 2010

\p{L}* должно соответствовать «любому виду букв любого языка». Это должно работать, я использовал его в регулярном выражении для.

0 голосов
/ 13 октября 2018

Установите для параметра Regex значение none-жадный (ленивый).

/\p{L}/u
0 голосов
/ 01 июня 2010

\ w - соответствует любому буквенно-цифровому символу (включая цифры)

В моих тестах оно соответствовало:

  • A
  • A
  • ç
  • 8
  • г

и не соответствует:

  • ;
  • \

Если вы точно знаете, что хотите исключить (например, небольшой список), вы можете сделать следующее:

[^;. \ `]

, который соответствует один раз любому символу, который не является:

  • ;
  • \
  • `
  • .

Надеюсь, это поможет!

...