web-dev-qa-db-ja.com

かっこで囲まれたテキスト(角かっこ)を抽出する方法

User name (sales)という文字列があり、括弧で囲まれたテキストを抽出したいのですが、どうすればよいでしょうか。

私はサブストリングを疑っています、しかし、私は右括弧、テキストの長さが変わるであろうまで読み方を考え出すことができません。

210
Ben H

それを行うための非常に簡単な方法は、正規表現を使うことです。

Regex.Match("User name (sales)", @"\(([^)]*)\)").Groups[1].Value

(非常に面白い)コメントに対する返答として、これと同じ正規表現を説明します。

\(             # Escaped parenthesis, means "starts with a '(' character"
    (          # Parentheses in a regex mean "put (capture) the stuff 
               #     in between into the Groups array" 
       [^)]    # Any character that is not a ')' character
       *       # Zero or more occurrences of the aforementioned "non ')' char"
    )          # Close the capturing group
\)             # "Ends with a ')' character"
409
Diadistis

正規表現を避けたい場合は、私が考えることができる最も簡単な方法は次のとおりです。

string input = "User name (sales)";
string output = input.Split('(', ')')[1];
401
Jelly Ama

括弧が1組しかないとします。

string s = "User name (sales)";
int start = s.IndexOf("(") + 1;
int end = s.IndexOf(")", start);
string result = s.Substring(start, end - start);
92
Ross Goddard

この機能を使う:

public string GetSubstringByString(string a, string b, string c)
    {
        return c.Substring((c.IndexOf(a) + a.Length), (c.IndexOf(b) - c.IndexOf(a) - a.Length));
    }

そしてここに使い方があります:

GetSubstringByString("(", ")", "User name (sales)")

出力は次のようになります。

sales
24
artfulhacker

ここでは、正規表現が最適なツールである可能性があります。それらに慣れていない場合は、 Expresso -素晴らしい小さな正規表現ツールをインストールすることをお勧めします。

何かのようなもの:

Regex regex = new Regex("\\((?<TextInsideBrackets>\\w+)\\)");
string incomingValue = "Username (sales)";
string insideBrackets = null;
Match match = regex.Match(incomingValue);
if(match.Success)
{
    insideBrackets = match.Groups["TextInsideBrackets"].Value;
}
14
Jennifer
string input = "User name (sales)";

string output = input.Substring(input.IndexOf('(') + 1, input.IndexOf(')') - input.IndexOf('(') - 1);
14
Nick Allen

多分正規表現?私はこれがうまくいくと思います...

\(([a-z]+?)\)
13
chills42
using System;
using System.Text.RegularExpressions;

private IEnumerable<string> GetSubStrings(string input, string start, string end)
{
    Regex r = new Regex(Regex.Escape(start) +`"(.*?)"`  + Regex.Escape(end));
    MatchCollection matches = r.Matches(input);
    foreach (Match match in matches)
    yield return match.Groups[1].Value;
}
7
Bilal Mrad

正規表現を使う:

string test = "(test)"; 
string Word = Regex.Match(test, @"\((\w+)\)").Groups[1].Value;
Console.WriteLine(Word);
4
Will Dean
input.Remove(input.IndexOf(')')).Substring(input.IndexOf('(') + 1);
2
Rockcoder

regexメソッドが優れていると思いますが、謙虚なsubstringを使いたい場合は

string input= "my name is (Jayne C)";
int start = input.IndexOf("(");
int stop = input.IndexOf(")");
string output = input.Substring(start+1, stop - start - 1);

または

string input = "my name is (Jayne C)";
string output  = input.Substring(input.IndexOf("(") +1, input.IndexOf(")")- input.IndexOf("(")- 1);
2
inspite
int start = input.IndexOf("(") + 1;
int length = input.IndexOf(")") - start;
output = input.Substring(start, length);

正規表現は非常に便利ですが、書くのは非常に難しいと思います。それで、私はいくつかの調査をして、これを見つけることを ツール それはそれらを書くのをとても簡単にする。

構文を理解するのが難しいので、それらを敬遠しないでください。彼らはとても強力になることができます。

1
katyholb

このコードは、(すべてではないにしても)ほとんどのソリューションよりも高速です。 Stringextension method としてパックされ、再帰的な入れ子はサポートされていません。

public static string GetNestedString(this string str, char start, char end)
{
    int s = -1;
    int i = -1;
    while (++i < str.Length)
        if (str[i] == start)
        {
            s = i;
            break;
        }
    int e = -1;
    while(++i < str.Length)
        if (str[i] == end)
        {
            e = i;
            break;
        }
    if (e > s)
        return str.Substring(s + 1, e - s - 1);
    return null;
}

これは少し長く遅くなりますが、再帰的な入れ子をよりうまく処理します。

public static string GetNestedString(this string str, char start, char end)
{
    int s = -1;
    int i = -1;
    while (++i < str.Length)
        if (str[i] == start)
        {
            s = i;
            break;
        }
    int e = -1;
    int depth = 0;
    while (++i < str.Length)
        if (str[i] == end)
        {
            e = i;
            if (depth == 0)
                break;
            else
                --depth;
        }
        else if (str[i] == start)
            ++depth;
    if (e > s)
        return str.Substring(s + 1, e - s - 1);
    return null;
}
0
watbywbarif

これはregexの使用を避ける汎用の読みやすい関数です。

// Returns the text between 'start' and 'end'.
string ExtractBetween(string text, string start, string end)
{
  int iStart = text.IndexOf(start);
  iStart = (iStart == -1) ? 0 : iStart + start.Length;
  int iEnd = text.LastIndexOf(end);
  if(iEnd == -1)
  {
    iEnd = text.Length;
  }
  int len = iEnd - iStart;

  return text.Substring(iStart, len);
}

あなたの特定の例でそれを呼び出すためにあなたはすることができます:

string result = ExtractBetween("User name (sales)", "(", ")");
0
ChaimG

非常によく似た実装の解決策を探しているときに、私はこれに出会いました。

これが私の実際のコードからの抜粋です。最初の文字(インデックス0)から部分文字列を開始します。

 string separator = "\n";     //line terminator

 string output;
 string input= "HowAreYou?\nLets go there!";

 output = input.Substring(0, input.IndexOf(separator)); 
0
nikk