Я пытаюсь подсчитать количество слов в сообщении.
У меня есть эта строка кода:
var nbOccurences = Regex.Matches(haystack, needle, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase).Count;
Что работает отлично, например, "bob" в сообщении "мое имя - bob".
Но (поскольку сообщение может быть на французском языке), я бы хотел найти "chene", "chène", "chêne"... при поиске "chene". Прямо сейчас слова с акцентами не приносят результатов.
Я думал, что добавление RegexOptions.CultureInvariant поможет, но это не похоже на это.
Любая помощь будет оценена по достоинству.
Вы можете использовать этот метод для преобразования расширенных букв в их базу:
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
.
Этот параметр (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;
(взято из разрешенных буквенных символов?)