本机Win32 API确实公开了找到的字符串长度。您可以使用P/Invoke直接调用FindNLSStringEx
:
static class CompareInfoExtensions
{
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern int FindNLSStringEx(string lpLocaleName, uint dwFindNLSStringFlags, string lpStringSource, int cchSource, string lpStringValue, int cchValue, out int pcchFound, IntPtr lpVersionInformation, IntPtr lpReserved, int sortHandle);
const uint FIND_FROMSTART = 0x00400000;
public static int IndexOfEx(this CompareInfo compareInfo, string source, string value, int startIndex, int count, CompareOptions options, out int length)
{
// Argument validation omitted for brevity
return FindNLSStringEx(compareInfo.Name, FIND_FROMSTART, source, source.Length, value, value.Length, out length, IntPtr.Zero, IntPtr.Zero, 0);
}
}
static class Program
{
static void Main()
{
var s = "<<Gewerbegebiet Waldstraße>>";
//var s = "<<Gewerbegebiet Waldstrasse>>";
int length;
int start = new CultureInfo("de-DE").CompareInfo.IndexOfEx(s, "strasse", 0, s.Length, CompareOptions.None, out length);
Console.WriteLine(s.Substring(0, start) + s.Substring(start + length));
}
}
我没有看到完全使用BCL来实现这一点的方法。
string.Replace
不考虑文化差异,所以"ss"不能匹配"ß"。 - juharren-US
并遇到了这个问题。问题是 IndexOf 的行为不同。 - M.kazem Akhgarys.Replace("ß", "ss")
会怎样? - juharrStringComparison.Ordinal
,那么当然会给我-1,但是.Net开发人员应该考虑为Replace
和Remove
方法添加这些重载,并且它们应该像IndexOf
一样运行。 - M.kazem Akhgary