Regex не соответствует всем иностранным символам - PullRequest
0 голосов
/ 15 ноября 2018

Вот мое регулярное выражение ^([\\p{L}-|a-zA-Z0-9-_]+)$, и оно должно разрешать все иностранные буквы, а также числовые буквы, цифры.Но по какой-то причине символы хинди не могут совпадать.

Я написал тест Xunit для доказательства.

[Fact]
        public void test()
        {
            var hindiChar = "इम्तहान";
            var input = "12345ABCDPrüfungテスト中文테스트إسرائيل" + hindiChar;
            var regex = "^([\\p{L}-|a-zA-Z0-9-_]+)$";
            Assert.True(new Regex(regex).IsMatch(input));
        }

Если вы удалите hindiChar, тест вернет true;но если вы добавите hindiChar, тест вернет false.

Я думал, что часть регулярного выражения состоит в том, чтобы соответствовать всем иностранным символам, но не уверен, почему он не соответствует символам хинди.

1 Ответ

0 голосов
/ 15 ноября 2018

Недостаточно использовать \p{L} для сопоставления слов, также необходимо сопоставлять диакритические знаки.Это можно сделать, добавив \p{M} к вашему регулярному выражению.Обратите внимание, что даже класс символов \w сокращенного «слова» в регулярном выражении .NET по умолчанию также соответствует набору диакритических знаков, \p{Mn} ( Mark, Nonspacing Категория символов Unicode), см. this.NET регулярное выражение .Однако здесь вам нужно \p{M}, чтобы разрешить любые диакритические знаки.

Обратите внимание, что | внутри класса символов соответствует буквальному символу |, поэтому вам нужно удалить | из вашего шаблона.

Мне кажется, вы используете

@"^[\p{L}\p{M}0-9_-]+$"

Он будет соответствовать любой строке из одной или нескольких букв, диакритических знаков, цифр ASCII, _ или - символов.

См. regex demo .

Обратите внимание, что если вы хотите разрешить любые символы Unicode, вы можете даже использовать

@"^[\w\p{M}-]+$"

См. еще одно демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...