我有这个问题,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);
}
}
答案 0 :(得分:5)
虽然@sa_ddam213's answer肯定能解决问题,但它可能有助于准确理解这个特定字符串的内容。
如果您尝试使用其他“特殊字符”的示例,则不会出现问题。例如,以下字符串按预期工作:
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
有问题的人物“'”被称为spacing modifier letter 1 。间距修饰符字母不能单独使用,而是修改字符串中的 previous 字符,本例为“/”。另一种说法就是它在渲染时不会占用自己的空间。
LastIndexOf
,在没有StringComparison
参数的情况下调用时,会使用当前文化来比较字符串。
当以文化敏感的方式比较字符串时,“/”和“'”字符不会被视为两个不同的字符 - 它们被处理成一个字符,不匹配传递给LastIndexOf
的参数。
当您将StringComparison.Ordinal
传递给LastIndexOf
时,由于序数比较的性质,字符会被视为不同。
另一种方法是使用CompareInfo.LastIndexOf
并提供CompareOptions.IgnoreNonSpace
选项:
Console.WriteLine(
CultureInfo.CurrentCulture.CompareInfo.LastIndexOf(
wikiPageUrl, @"it.wikipedia.org/wiki/", CompareOptions.IgnoreNonSpace));
// 7
这里我们说我们不希望在字符串比较中包含组合字符。
作为旁注,这意味着@Partha's answer和@Noctis' answer仅起作用,因为该字符被应用于未出现在传递给LastIndexOf
的搜索字符串中的字符。
将此与Contains
方法进行对比,该方法默认执行Ordinal(区分大小写和敏感的)比较。这解释了为什么Contains
返回true
而LastIndexOf
返回false
。
有关如何在.NET框架中操作字符串的精彩概述,请查看this article。
1 :这是否与组合字符不同,还是一种组合字符?如果有人愿意为我解决这个问题,我将不胜感激。
答案 1 :(得分:3)
尝试使用StringComparison.Ordinal
这将通过评估每个string
中相应chars
的数值来比较string
,这应该与您在该示例中使用的特殊chars
一致{ {1}}
string
//返回0;
答案 2 :(得分:2)
事情是C#lastindexof从后面看。
wikipedia.org/wiki/
之后是'
,它作为转义序列。因此,要么'
之后删除wiki/
,要么@
删除。
以下语法将起作用(任何人)
string wikiPageUrl = @"http://it.wikipedia.org/wiki/Abd_Allāh_al-Sallāl";
string wikiPageUrl = @"http://it.wikipedia.org/wiki/@ʿAbd_Allāh_al-Sallāl";
int i = wikiPageUrl.LastIndexOf("wikipedia.org/wiki");
所有3个作品
如果您需要针对此问题的通用解决方案,请在执行任何操作之前将'
替换为字符串中的@'
。
答案 3 :(得分:0)
'
个字符将其抛弃。
当您将'
作为\'
转义
wikiPageUrl = @"http://it.wikipedia.org/wiki/\'Abd_Allāh_al-Sallāl";
if (wikiPageUrl.Contains("wikipedia.org/wiki/"))
{
"contains".Dump();
int i = wikiPageUrl.LastIndexOf("wikipedia.org/wiki/");
Console.WriteLine(i);
}
弄清楚你想做什么(删除'
,逃避它,或深入挖掘:))。