web-dev-qa-db-ja.com

文字列内の2つの文字列の間の文字列を取得します

私は次のような文字列を持っています:

"super exemple of string key : text I want to keep - end of my string"

"key : "" - "の間の文字列を保持したいだけです。どうやってやるの?正規表現を使用する必要がありますか、それとも別の方法で実行できますか?

83
flow

おそらく、良い方法はsubstringを切り取るだけです:

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);
129
Dmitry Bychenko
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;

または単に文字列操作で

var start = input.IndexOf("key : ") + 6;
var match2 = input.Substring(start, input.IndexOf("-") - start);
30
I4V

あなたは正規表現なしでそれを行うことができます

 input.Split(new string[] {"key :"},StringSplitOptions.None)[1]
      .Split('-')[0]
      .Trim();
25
Anirudha

実装の堅牢性と柔軟性に応じて、実際には少し注意が必要です。私が使用する実装は次のとおりです。

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 "
12
ChaseMedallion

正規表現はここではやり過ぎです。

あなたはcould区切り文字にstring.Splitを使用するオーバーロードでstring[]を使用しますが、それはalsoやりすぎ。

SubstringIndexOf を見てください-前者は与えられた文字列の一部を取得し、インデックスと長さを取得し、2番目は内部の文字列/文字のインデックスを検索します。

10
Oded

ここに私がそれを行う方法があります

   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;
    }
10

私はこれがうまくいくと思う:

   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);                      
    }
8
fr0ga

動作する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
5
w.b

または、正規表現を使用します。

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;

実行例 で。

やり過ぎかどうかを判断できます。

または

検証不足の拡張メソッドとして

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;
    }
}
5
Jodrell
 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);
5
Dejan Ciev
var matches = Regex.Matches(input, @"(?<=key :)(.+?)(?=-)");

これは、「key:」とそれに続く「-」の間にある値のみを返します

3
fboethius

:-は一意なので、使用できます:

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];
3
Michael Freeman

以下の拡張方法を使用できます。

public static string GetStringBetween(this string token, string first, string second)
    {            
        if (!token.Contains(first)) return "";

        var afterFirst = token.Split(new[] { first }, StringSplitOptions.None)[1];

        if (!afterFirst.Contains(second)) return "";

        var result = afterFirst.Split(new[] { second }, StringSplitOptions.None)[0];

        return result;
    }

使用法は次のとおりです。

var token = "super exemple of string key : text I want to keep - end of my string";
var keyValue = token.GetStringBetween("key : ", " - ");
2
serefbilge

1行のソリューションを探している場合、これは次のとおりです。

s.Substring(s.IndexOf("eT") + "eT".Length).Split("97".ToCharArray()).First()

System.Linqを使用した1行のソリューション全体:

using System;
using System.Linq;

class OneLiner
{
    static void Main()
    {
        string s = "TextHereTisImortant973End"; //Between "eT" and "97"
        Console.WriteLine(s.Substring(s.IndexOf("eT") + "eT".Length)
                           .Split("97".ToCharArray()).First());
    }
}
1
Vityata

すでにいくつかの良い答えがあり、私が提供しているコードは、最も効率的でクリーンなものとはほど遠いことを理解しています。しかし、私はそれが教育目的に役立つかもしれないと思いました。ビルド済みのクラスとライブラリを終日使用できます。しかし、内なる働きを理解しなければ、私たちは単純に模倣して繰り返し、何も学ぶことはありません。このコードは機能し、他のいくつかのコードよりも基本的または「バージン」です。

char startDelimiter = ':';
char endDelimiter = '-';

Boolean collect = false;

string parsedString = "";

foreach (char c in originalString)
{
    if (c == startDelimiter)
         collect = true;

    if (c == endDelimiter)
         collect = false;

    if (collect == true && c != startDelimiter)
         parsedString += c;
}

ParsedString変数に必要な文字列が割り当てられます。進行中のスペースと先行スペースもキャプチャすることに注意してください。文字列は、インデックスなどを持つ他の配列のように操作できる単なる文字の配列であることを忘れないでください.

世話をする。

1
flyNflip

基本的に仕事をするVijay Singh Ranaのコードスニペットを使用しました。ただし、firstStringに既にlastStringが含まれている場合は、問題が発生します。私が欲しかったのは、JSONレスポンスからaccess_tokenを抽出することでした(JSONパーサーはロードされませんでした)。私のfirstString\"access_token\": \"で、「lastString」は\"でした。少し修正された

string Between(string str, string firstString, string lastString)
{       
    string finalString;     
    int pos1 = str.IndexOf(firstString) + firstString.Length;
    int pos2 = str.Substring(pos1).IndexOf(lastString) + pos1;
    finalString = str.Substring(pos1, pos2 - pos1);
    return finalString;
}
0
user3231903

私はいつも何も不可能ではないと言うように:

string value =  "super exemple of string key : text I want to keep - end of my string";
Regex regex = new Regex(@"(key \: (.*?) _ )");
Match match = regex.Match(value);
if (match.Success)
{
    Messagebox.Show(match.Value);
}

私が助けたことを願っています。

.

0
Ahmed Alaa