如何获得字符串的中间部分?

时间:2013-04-25 10:34:46

标签: c#

我在

下面有一个字符串
var input= "dbo.xyx.v1.UserDefinedFunction";

所需的输出将是“xyx.v1”;

我的尝试是

var input = "dbo.xyx.v1.UserDefinedFunction";
var intermediate = input.Split('.').Skip(1);
var res = intermediate.Reverse().Skip(1).Aggregate((a, b) => b + "." + a);

工作得很好..但任何其他适当而优雅的方法?

请注意,它可以是任何部分(在示例中我只显示了4个部分)

e.g。 输入:“dbo.part1.part2.part3.part4.UserDefinedFunction” 输出:“part1.part2.part3.part4”

8 个答案:

答案 0 :(得分:2)

这将始终返回字符串的中间部分,该部分可以是一个或两个部分(根据总部件编号)。

var input = "dbo.xyx.v1.UserDefinedFunction";
string[] tokens = input.Split('.');
int midIndex = (tokens.Length - 1) / 2;
IEnumerable<int> midIndices = midIndex % 2 == 0
    ? new[] { midIndex }
    : new[] { midIndex, midIndex + 1 };
string mid  = string.Join(".", tokens.Where((t, i) => midIndices.Contains(i)));

Demo

所以在这种情况下它返回xyx.v1,对于字符串bo.xyx.v1,它返回v1,因为那是唯一的中间部分。

答案 1 :(得分:1)

如果您需要使用LINQ,可以使用Skip(1).Take(2)string.Join,如下所示:

var parts = input.Split('.');
var res = string.Join(".", parts.Skip(1).Take(parts.Length-2));

如果您需要丢弃第一个和最后一个部分,那么您可以使用Substring,如下所示:

var start = input.IndexOf('.')+1;
var end = input.LastIndexOf('.')-1;
var res = input.Substring(start, end-start+1);

最后,您可以使用正则表达式,如下所示:

var res = Regex.Replace(input, "^[^.]+[.](.+)[.][^.]+$", "$1");

答案 2 :(得分:1)

var input = "dbo.xyx.v1.UserDefinedFunction";
var res = string.Join(".", input.Split('.').Skip(1).Take(2));

答案 3 :(得分:1)

   string output= input.Substring(input.IndexOf('.') + 1, 
                  input.LastIndexOf('.') - input.IndexOf('.') - 1);

答案 4 :(得分:1)

var input = "dbo.xyx.v1.UserDefinedFunction";
var start = input.IndexOf('.');
var end = input.LastIndexOf('.');
string output;
if (start < end)
{
    output = input.Substring(start+1, end-start-1);
}
else
{
    output = input;
}

答案 5 :(得分:0)

var input = "dbo.xyx.v1.UserDefinedFunction";
var intermediate = input.Split('.');
var res = string.Join(".", intermediate[1],intermediate[2]);
任何零件版本的

编辑

var res = string.Join(".", intermediate.Skip(1).Take(intermediate.Length - 2));

答案 6 :(得分:0)

您可以简化它并执行:

var split = input.Split(".");
var result = String.Join(".", split[1], split[2]);

无需SkipTake

答案 7 :(得分:0)

[TestClass]
public class UnitTest2
{
    [TestMethod]
    public void TestMethod1()
    {

        var ret = "this.is.my.test.string".MySplit(".", new int[] {0,1,4 });//this.is.string

    }
}

public static class Process {
    public static string MySplit(this string Source, string seprator, int[] positionTokeep) {
        var items = Source.Split(seprator.ToCharArray());
        string ret = string.Empty;
        for (int i = 0; i < positionTokeep.Length; i++) {
            ret += items[positionTokeep[i]] + seprator;
        }
        if (!string.IsNullOrWhiteSpace(ret)) {
            ret = ret.Substring(0,ret.Length - seprator.Length);
        }
        return ret;
    }
}