Ответ 1
Для этого вам нужно использовать свойства и блоки символов Unicode. Каждая точка кода Юникода присвоила некоторые свойства, например. этот пункт - Письмо. Блоки представляют собой диапазоны кодовой точки.
Подробнее см.
Эти свойства и блоки Unicode записываются \p{Name}
, где "Имя" - это имя свойства или блока.
Если это верхний регистр "P", такой как \p{Name}
, то это отрицание свойства/блока, то есть оно соответствует чему-либо еще.
Есть, например, некоторые свойства (только короткий отрывок):
- L == > Все буквы.
- Lu == > Letter, Uppercase
- Ll == > Letter, Lowercase
- N == > Все номера. Это включает категории Nd, Nl и Нет.
- Pc == > Пунктуация, коннектор
- P == > Все знаки пунктуации. Сюда входят категории Pc, Pd, Ps, Pe, Pi, Pf и Po.
- Sm == > Символ, математика
Есть, например, некоторые блоки (только короткий отрывок):
- 0000 - 007F == > IsBasicLatin
- 0400 - 04FF == > IsCyrillic
- 1000 - 109F == > IsMyanmar
Что я использовал в решении:
\P{L}
- свойство символа, которое сопоставляет любой символ, который не является буквой ( "L" для буквы)
\p{IsBasicLatin}
- это блок Unicode, который соответствует кодовым точкам 0000 - 007F
Итак, ваше регулярное выражение будет:
^[\P{L}\p{IsBasicLatin}]+$
Простыми словами:
Это соответствует строке от начала до конца (^
и $
), когда есть (по крайней мере один) только не буквы или символы из таблицы ASCII (точки выполнения 0000 - 007F)
Короткий метод тестирования С#:
string[] myStrings = { "Foobar",
"[email protected]!\"§$%&/()",
"Föobar",
"fóÓè"
};
Regex reg = new Regex(@"^[\P{L}\p{IsBasicLatin}]+$");
foreach (string str in myStrings) {
Match result = reg.Match(str);
if (result.Success)
Console.Out.WriteLine("matched ==> " + str);
else
Console.Out.WriteLine("failed ==> " + str);
}
Console.ReadLine();
Печать
соответствует == > Foobar
сопоставлено == > Foo @bar!\"§ $% &/()
failed == > Föobar
failed == > fóÓè