Культурная проблема с регулярным выражением

1

Я пытаюсь подсчитать количество слов в сообщении.

У меня есть эта строка кода:

 var nbOccurences = Regex.Matches(haystack, needle, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase).Count;

Что работает отлично, например, "bob" в сообщении "мое имя - bob".

Но (поскольку сообщение может быть на французском языке), я бы хотел найти "chene", "chène", "chêne"... при поиске "chene". Прямо сейчас слова с акцентами не приносят результатов.

Я думал, что добавление RegexOptions.CultureInvariant поможет, но это не похоже на это.

Любая помощь будет оценена по достоинству.

Теги:

2 ответа

0
Лучший ответ

Вы можете использовать этот метод для преобразования расширенных букв в их базу:

string RemoveDiacritics(string stIn)
    {
        var stFormD = stIn.Normalize(NormalizationForm.FormD);
        var sb = new StringBuilder();
        for (var ich = 0; ich < stFormD.Length; ich++)
        {
            var uc = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
            if (uc != System.Globalization.UnicodeCategory.NonSpacingMark)
                sb.Append(stFormD[ich]);
        }

        return (sb.ToString().Normalize(NormalizationForm.FormC));
    }

А потом:

var haystack = "chêne name is chène";
var needle = "chène";
var nbOccurences = Regex.Matches(RemoveDiacritics(haystack), RemoveDiacritics(needle), RegexOptions.CultureInvariant | RegexOptions.IgnoreCase).Count;

nbOccurences будет равно 2.

0

Этот параметр (RegexOptions.CultureInvariant) связан только с RegexOptions.IgnoreCase. От https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions(v=vs.90).aspx

CultureInvariant

Указывает, что культурные различия в языке игнорируются. Дополнительные сведения см. В разделе Выполнение операций, нечувствительных к культуре, в пространстве имен RegularExpressions.

Я не думаю, что есть способ сделать то, что вы хотите, кроме наличия версии текста для поиска без диакритики (см., Например, Как удалить диакритические знаки (акценты) из строки в.NET?)

Обратите внимание: если вы просто хотите найти слово, вы можете:

var compareinfo = CultureInfo.InvariantCulture.CompareInfo;
var index = compareinfo.IndexOf("My name is chêne", "chene", CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase);
bool found = index > -1;

(взято из разрешенных буквенных символов?)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню