从字符串中获取倒数第二个字符的位置

6

我有一个动态生成的字符串,如下所示 - part1.abc.part2.abc.part3.abc

我想知道倒数第二个 "." 的位置,以便我可以将字符串分割为 part1.abc.part2.abc 和 part3.abc

请告诉我是否有任何直接方法可用于获取此信息?


你的需求不太明确。你是想把 a.b.c 分割成 a, b, c 吗? - Deeptechtons
1
当你在一个('.')上分割时,你可以得到一个字符串数组,数组中的最后两个单词是“part3”和“abc”。可以尝试操作一下。 - Rob
1
分割许多字符串(只为获取最后两个)可能会导致内存/性能问题,会创建许多无用的字符串。 - bitbonk
11个回答

16
string str = "part1.abc.part2.abc.part3.abc";
int ix1 = str.LastIndexOf('.');
int ix2 = ix1 > 0 ? str.LastIndexOf('.', ix1 - 1) : -1;

总是有正则表达式(和jQuery)的爱好者,因此我将给出一个正则表达式解决方案(如果您需要jQuery解决方案,则必须等待 :-)):

var match = Regex.Match(str, @"\.[^\.]*\.", RegexOptions.RightToLeft);
int ix = match.Success ? match.Index : -1;

请注意,我是一个正则表达式的反对者,我把代码给你只是为了让你有足够的绳子去自杀(如果你真这么选择的话)。

请注意,我正在使用RegexOptions.RightToLeft选项,以便正则表达式从最后一个字符开始匹配。


8
您可以使用String.LastIndexOf('.')方法来获取最后一个句点的位置,然后再使用第二个LastIndexOf('.')调用来获取倒数第二个,例如:
string aString = "part1.abc.part2.abc.part3.abc";
int lastPos = aString.LastIndexOf('.');

int lastPosButOne = aString.LastIndexOf('.', lastPos - 1);

我建议使用String.Split('.')来获得字符串部分的数组,然后您可以获取倒数第二个部分,例如:
string aString = "part1.abc.part2.abc.part3.abc";
string[] parts = aString.Split('.');

string lastPartButOne = parts[parts.Length - 1];

4

这里是另一种解决方案:

         string aString = "part1.abc.part2.abc.part3.abc";
        // Getting string until last dot
        var untilLastDot = aString.Substring(0, aString.LastIndexOf("."));
        // Now we have string until last dot and last dot here will be last but one 
        // and getting text from last but one dot to end
        string lastWordButOne = aString.Substring(untilLastDot.LastIndexOf(".") + 1);
        // Result: part3.abc

希望能对您有所帮助,谢谢!

2
据我所知,目前没有现成的解决方案。一种方法是使用字符串的LastIndexOf方法找到最后一个“.”,然后再次搜索最后一个点,这次使用重载的版本,让你可以指定起始索引和计数,使用第一次调用的索引作为参数来计数。

1
你可以使用String.Split()方法,该方法返回一个分割后的项目数组。然后你可以将前两个连接在一起并保留最后一个。

1
尝试使用字符串类的LastIndexOf方法。

1

在这种情况下,"part1.abc.part2.abc.part3.abc".Split('.')会得到一个包含所有子字符串的数组。

希望这可以帮到你。


1

LastIndexOf 应该满足您的需求。只需要执行两次即可。


1
基于 @bitbonk 的回答,我使用了下面这段代码,它是 VFPRAT() 函数的复制品。
    public static int RightIndexAt(this string expressionToSearch, char charToSearch, int occurence)
    {
        //Validate parameter
        if (occurence < 1)
            return -1;

        int index = -1;
        int numfound = 0;

        for (int count = expressionToSearch.Length - 1; count >= 0; count--)
        {
            if (expressionToSearch[count].Equals(charToSearch))
            {
                index = count;
                numfound++;
            }

            if (numfound.Equals(occurence))
                break;
        }

        return numfound < occurence ? -1 : index;
    }

0

这将是最佳性能的解决方案(除非您想采用不安全的方法,否则它可能不会比这更快速和轻量级):

public static int LastIndexOf(this string str, char charToSearch, int repeatCound)
{
    int index = -1;
    for(int i = str.Length - 1; i >= 0, numfound < repeatCound)
    {
        if(str[i] == charToSearch)
        {
            index = i; 
            numfound++;
        }
    }

    return index;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接