5

我有这个问题,其中 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);

        }
    }
4

4 回答 4

5

虽然@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

有问题的字符“ʿ”称为间距修饰符字母1。间距修饰符字母不是独立存在的,而是修饰字符串中的前一个字符,本例为“/”。另一种说法是它在渲染时不占用自己的空间。

LastIndexOf,当不带StringComparison参数调用时,使用当前区域性比较字符串。

当以文化敏感的方式比较字符串时,“/”和“ʿ”字符不会被视为两个不同的字符——它们被处理成一个字符,与传入的参数不匹配LastIndexOf

当您传递StringComparison.OrdinalLastIndexOf时,由于序数比较的性质,字符被视为不同的。

完成这项工作的另一种方法是使用CompareInfo.LastIndexOf和提供CompareOptions.IgnoreNonSpace选项:

Console.WriteLine(
    CultureInfo.CurrentCulture.CompareInfo.LastIndexOf(
        wikiPageUrl, @"it.wikipedia.org/wiki/", CompareOptions.IgnoreNonSpace));
// 7

在这里,我们说我们不想组合字符串比较中包含的字符。

作为旁注,这意味着@Partha的答案@Noctis 的答案仅起作用,因为该字符被应用于未出现在传递给的搜索字符串中的字符LastIndexOf

将此与Contains默认情况下执行 Ordinal(区分大小写和区分区域性)比较的方法进行对比。这就解释了为什么Contains退货trueLastIndexOf退货false

有关如何在 .NET 框架中操作字符串的精彩概述,请查看这篇文章


1:这与组合字符不同还是一种组合字符?如果有人能为我解决这个问题,我将不胜感激。

于 2014-09-02T02:45:06.927 回答
3

尝试使用StringComparison.Ordinal

这将通过评估每个string中对应的数值来比较,这应该与您在该示例中的特殊情况一起使用charsstringcharsstring

 string wikiPageUrl = @"http://it.wikipedia.org/wiki/ʿAbd_Allāh_al-Sallāl";
 int i = wikiPageUrl.LastIndexOf("http://it.wikipedia.org/wiki/", StringComparison.Ordinal);

// 返回 0;

于 2014-09-02T01:10:56.407 回答
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 部作品

如果您想要针对此问题的通用解决方案,请在执行任何操作之前在您的字符串中'替换为。@'

于 2014-09-02T01:04:24.290 回答
0

'人物把它扔掉了。

当您转义'as时,这应该可以工作\'

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);

}

弄清楚你想做什么(删除',逃避它,或者深入挖掘:))。

于 2014-09-02T00:59:22.283 回答