获取字符串中两个字符串之间的字符串

flo*_*low 89 c# regex string

我有一个字符串:

"super exemple of string key : text I want to keep - end of my string"
Run Code Online (Sandbox Code Playgroud)

我想保留在"key : "和之间的字符串" - ".我怎样才能做到这一点?我必须使用正则表达式,还是可以用其他方式进行?

Dmi*_*nko 142

也许,一个好方法就是剪切一个子字符串:

String St = "super exemple of string key : text I want to keep - end of my string";

int pFrom = St.IndexOf("key : ") + "key : ".Length;
int pTo = St.LastIndexOf(" - ");

String result = St.Substring(pFrom, pTo - pFrom);
Run Code Online (Sandbox Code Playgroud)


I4V*_*I4V 33

string input = "super exemple of string key : text I want to keep - end of my string";
var match = Regex.Match(input, @"key : (.+?)-").Groups[1].Value;
Run Code Online (Sandbox Code Playgroud)

或只是字符串操作

var start = input.IndexOf("key : ") + 6;
var match2 = input.Substring(start, input.IndexOf("-") - start);
Run Code Online (Sandbox Code Playgroud)

  • 您知道哪一个表现更好吗? (2认同)

Ani*_*dha 28

你可以在没有正则表达式的情况下完成

 input.Split(new string[] {"key :"},StringSplitOptions.None)[1]
      .Split('-')[0]
      .Trim();
Run Code Online (Sandbox Code Playgroud)

  • 这将在内存中创建多个不需要的字符串。如果您在乎内存,请不要使用它。 (3认同)

Cha*_*ion 14

根据您希望实现的强大/灵活程度,这实际上有点棘手.这是我使用的实现:

public static class StringExtensions {
    /// <summary>
    /// takes a substring between two anchor strings (or the end of the string if that anchor is null)
    /// </summary>
    /// <param name="this">a string</param>
    /// <param name="from">an optional string to search after</param>
    /// <param name="until">an optional string to search before</param>
    /// <param name="comparison">an optional comparison for the search</param>
    /// <returns>a substring based on the search</returns>
    public static string Substring(this string @this, string from = null, string until = null, StringComparison comparison = StringComparison.InvariantCulture)
    {
        var fromLength = (from ?? string.Empty).Length;
        var startIndex = !string.IsNullOrEmpty(from) 
            ? @this.IndexOf(from, comparison) + fromLength
            : 0;

        if (startIndex < fromLength) { throw new ArgumentException("from: Failed to find an instance of the first anchor"); }

            var endIndex = !string.IsNullOrEmpty(until) 
            ? @this.IndexOf(until, startIndex, comparison) 
            : @this.Length;

        if (endIndex < 0) { throw new ArgumentException("until: Failed to find an instance of the last anchor"); }

        var subString = @this.Substring(startIndex, endIndex - startIndex);
        return subString;
    }
}

// usage:
var between = "a - to keep x more stuff".Substring(from: "-", until: "x");
// returns " to keep "
Run Code Online (Sandbox Code Playgroud)


Vij*_*ana 12

这是我如何做到这一点的方式

   public string Between(string STR , string FirstString, string LastString)
    {       
        string FinalString;     
        int Pos1 = STR.IndexOf(FirstString) + FirstString.Length;
        int Pos2 = STR.IndexOf(LastString);
        FinalString = STR.Substring(Pos1, Pos2 - Pos1);
        return FinalString;
    }
Run Code Online (Sandbox Code Playgroud)


小智 11

我认为这有效:

   static void Main(string[] args)
    {
        String text = "One=1,Two=2,ThreeFour=34";

        Console.WriteLine(betweenStrings(text, "One=", ",")); // 1
        Console.WriteLine(betweenStrings(text, "Two=", ",")); // 2
        Console.WriteLine(betweenStrings(text, "ThreeFour=", "")); // 34

        Console.ReadKey();

    }

    public static String betweenStrings(String text, String start, String end)
    {
        int p1 = text.IndexOf(start) + start.Length;
        int p2 = text.IndexOf(end, p1);

        if (end == "") return (text.Substring(p1));
        else return text.Substring(p1, p2 - p1);                      
    }
Run Code Online (Sandbox Code Playgroud)


Ode*_*ded 10

正则表达式在这里有点过分.

可以使用string.Split带有string[]分隔符的重载,但这也是过度的.

看看SubstringIndexOf- 前者获取给定的字符串的部分和索引和长度,第二个用于查找内部字符串/字符的索引.

  • 这不是矫枉过正......实际上我会说Substring和IndexOf是不合理的.我会说string.Split是对的.正则表达式是矫枉过正. (2认同)
  • 过度杀戮或杀戮不足的观点没有实际意义,因为答案符合海报的要求,而不是正则表达式. (2认同)
  • @newStackExchangeInstance:如果"key:"之前有" - ",它也会失败.子串是现货. (2认同)

小智 9

在 C# 8.0 及更高版本中,您可以使用范围运算符,..如下所示

var s = "header-THE_TARGET_STRING.7z";
var from = s.IndexOf("-") + "-".Length;
var to = s.IndexOf(".7z");
var versionString = s[from..to];  // THE_TARGET_STRING
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅文档。


w.b*_*w.b 6

可行的LINQ解决方案:

string str = "super exemple of string key : text I want to keep - end of my string";
string res = new string(str.SkipWhile(c => c != ':')
                           .Skip(1)
                           .TakeWhile(c => c != '-')
                           .ToArray()).Trim();
Console.WriteLine(res); // text I want to keep
Run Code Online (Sandbox Code Playgroud)

  • 它仅适用于单个字符,不是OP所要求的,应该被否决 (3认同)

小智 5

 string str="super exemple of string key : text I want to keep - end of my string";
        int startIndex = str.IndexOf("key") + "key".Length;
        int endIndex = str.IndexOf("-");
        string newString = str.Substring(startIndex, endIndex - startIndex);
Run Code Online (Sandbox Code Playgroud)


Jod*_*ell 5

或者,正则表达式.

using System.Text.RegularExpressions;

...

var value =
    Regex.Match(
        "super exemple of string key : text I want to keep - end of my string",
        "key : (.*) - ")
    .Groups[1].Value;
Run Code Online (Sandbox Code Playgroud)

用一个运行的例子.

你可以决定它是否过度杀伤.

要么

作为一种经过验证的扩展方法

using System.Text.RegularExpressions;

public class Test
{
    public static void Main()
    {
        var value =
                "super exemple of string key : text I want to keep - end of my string"
                    .Between(
                        "key : ",
                        " - ");

        Console.WriteLine(value);
    }
}

public static class Ext
{
    static string Between(this string source, string left, string right)
    {
        return Regex.Match(
                source,
                string.Format("{0}(.*){1}", left, right))
            .Groups[1].Value;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

由于:和和-是唯一的,因此您可以使用:

string input;
string output;
input = "super example of string key : text I want to keep - end of my string";
output = input.Split(new char[] { ':', '-' })[1];
Run Code Online (Sandbox Code Playgroud)


nvm*_*uli 5

我使用了 Vijay Singh Rana 的代码片段,它基本上完成了这项工作。但是如果firstString确实已经包含lastString. 我想要的是从 JSON 响应中提取 access_token(未加载 JSON 解析器)。我的firstString过去\"access_token\": \"和我的lastString过去\"。我最后做了一点修改

string Between(string str, string firstString, string lastString)
{    
    int pos1 = str.IndexOf(firstString) + firstString.Length;
    int pos2 = str.Substring(pos1).IndexOf(lastString);
    return str.Substring(pos1, pos2);
}
Run Code Online (Sandbox Code Playgroud)