use*_*150 5 c# contains lastindexof
我有这个问题,String.Contains返回true,String.LastIndexOf返回-1.有人可以向我解释发生了什么吗?我使用的是.NET 4.5.
static void Main(string[] args)
{
String wikiPageUrl = @"http://it.wikipedia.org/wiki/?Abd_All?h_al-Sall?l";
if (wikiPageUrl.Contains("wikipedia.org/wiki/"))
{
int i = wikiPageUrl.LastIndexOf("wikipedia.org/wiki/");
Console.WriteLine(i);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然@ sa_ddam213的答案肯定能解决问题,但它可能有助于准确理解这个特定字符串发生了什么.
如果您尝试使用其他"特殊字符"的示例,则不会显示该问题.例如,以下字符串按预期工作:
string url1 = @"http://it.wikipedia.org/wiki/»Abd_All?h_al-Sall?l";
Console.WriteLine(url1.LastIndexOf("it.wikipedia.org/wiki/")); // 7
string url2 = @"http://it.wikipedia.org/wiki/~Abd_All?h_al-Sall?l";
Console.WriteLine(url2.LastIndexOf("it.wikipedia.org/wiki/")); // 7
Run Code Online (Sandbox Code Playgroud)
有问题的字符"'"称为间距修饰符字母 1.间距修饰符不单独存在,而是修改字符串中的前一个字符,本例为"/".另一种方法是在渲染时不占用自己的空间.
LastIndexOf,在没有StringComparison参数的情况下调用时,使用当前文化比较字符串.
当以文化敏感的方式比较字符串时,"/"和"'"字符不会被视为两个不同的字符 - 它们被处理成一个字符,与传入的参数不匹配LastIndexOf.
当你传递StringComparison.Ordinal到LastIndexOf的字符被视为不同,由于序号比较的性质.
另一种方法是使用CompareInfo.LastIndexOf和提供CompareOptions.IgnoreNonSpace选项:
Console.WriteLine(
CultureInfo.CurrentCulture.CompareInfo.LastIndexOf(
wikiPageUrl, @"it.wikipedia.org/wiki/", CompareOptions.IgnoreNonSpace));
// 7
Run Code Online (Sandbox Code Playgroud)
这里我们说我们不希望在字符串比较中包含组合字符.
作为旁注,这意味着@Patha 的回答和@Noctis的回答只能起作用,因为该字符被应用于未传递给搜索字符串的字符LastIndexOf.
与此对比Contains的方法,其通过默认执行序(区分大小写和培养在比较敏感).这解释了为什么Contains返回true和LastIndexOf返回false.
有关如何在.NET框架中操作字符串的精彩概述,请查看本文.
1:这与组合字符不同还是一种组合字符?如果有人愿意为我清除,我将不胜感激.
尝试使用StringComparison.Ordinal
这将通过评估每个中string对应的数值来进行比较,这应该适用于该示例中的特殊内容charsstringcharsstring
string wikiPageUrl = @"http://it.wikipedia.org/wiki/\xca\xbfAbd_All\xc4\x81h_al-Sall\xc4\x81l";\n int i = wikiPageUrl.LastIndexOf("http://it.wikipedia.org/wiki/", StringComparison.Ordinal);\nRun Code Online (Sandbox Code Playgroud)\n\n// 返回 0;
\n| 归档时间: |
|
| 查看次数: |
691 次 |
| 最近记录: |