5

文字列があるとします

いいね (20)

この文字列から丸括弧で囲まれた部分文字列 (上記の場合は 20) を取得したいと考えています。この部分文字列は、実行時に動的に変更できます。0 から無限大までの任意の数値である可能性があります。これを達成するために、私の考えは、for文字列全体を横断するループを使用し、 a(が存在する場合、別の文字配列に文字を追加し始め、 が検出されると)、文字の追加を停止して配列を返すことです。しかし、これはパフォーマンスが悪い可能性があると思います。私は正規表現についてほとんど知らないので、利用可能な正規表現ソリューションまたは効率的な方法でそれを行うことができる関数はありますか?

4

6 に答える 6

6

正規表現を使いたくない場合は、Splitを使用できます。

string foo = "Likes (20)";
string[] arr = foo.Split(new char[]{ '(', ')' }, StringSplitOptions.None);
string count = arr[1];

Count = 20

これは、括弧内の数に関係なく正常に機能します()

例えば:

いいね (242535345)

あげる:

242535345

于 2013-09-05T08:38:19.330 に答える
1

Linq でも:

var s = "Likes (20)";
var s1 = new string(s.SkipWhile(x => x != '(').Skip(1).TakeWhile(x => x != ')').ToArray());
于 2013-09-05T08:50:37.347 に答える
1
const string likes = "Likes (20)";
int likesCount = int.Parse(likes.Substring(likes.IndexOf('(') + 1, (likes.Length - likes.IndexOf(')') + 1 )));
于 2013-09-05T08:36:37.260 に答える
1

厳密に一致させるには、次のことができます。

Regex reg = new Regex(@"^Likes\((\d+)\)$");
Match m = reg.Match(yourstring);

このようにして、必要なものがすべて揃いますm.Groups[1].Value

I4V から示唆されているように、例のように、文字列全体にその数字のシーケンスしかないと仮定すると、より単純なバージョンを使用できます。

var res = Regex.Match(str,@"\d+")

このcanseでは、探している値を取得できますres.Value

編集

角かっこで囲まれた値が数字だけではない場合は、\d を、[\w\d\s]アルファベット文字、数字、およびスペースを許可する場合のように変更できます。

于 2013-09-05T08:36:47.697 に答える
1

純粋な文字列メソッドでも動作します:

string result = "Likes (20)";
int index = result.IndexOf('(');
if (index >= 0)
{
    result = result.Substring(index + 1); // take part behind (
    index = result.IndexOf(')');
    if (index >= 0)
        result = result.Remove(index);    // remove part from )
}

Demo

于 2013-09-05T08:41:10.747 に答える
1

括弧内の部分が数字であると想定される場合のマッチング。

string inputstring="Likes (20)"
Regex reg=new Regex(@"\((\d+)\)")
string num= reg.Match(inputstring).Groups[1].Value

説明: 定義上、regexp は部分文字列と一致するため、特に指定しない限り、探している文字列は文字列内の任意の場所に出現する可能性があります。

\d は数字を表します。任意の 1 桁に一致します。

潜在的に数回繰り返されることを望み、少なくとも 1 回は必要です。+ 記号は、1 回以上繰り返される前のシンボルまたはグループの正規表現です。

したがって、\d+ は 1 つ以上の数字に一致します。20に一致します。

括弧内の数値を確実に取得するには、( と ) の間にある必要があります。これらは正規表現の特殊文字であるため、エスケープする必要があります。

(\d+) は (20) と一致し、ほぼ完了です。

括弧内の部分が必要であり、括弧を含めないため、数字部分が単一のグループであることを正規表現に伝えます。

これは、正規表現で括弧を使用して行います。((\d+)) は引き続き (20) に一致しますが、20 はこの一致のサブグループであり、Match.Groups[] で取得できることがわかります。

括弧内の文字列の場合、少し難しくなります。

Regex reg=new Regex(@"\((.+)\)")

多くの文字列で機能します。(ドットは任意の文字に一致します)しかし、入力が「これは例です(parantesis1)(parantesis2)」のようなものである場合、キャプチャされたサブグループとして(parantesis1)(parantesis2)とparantesis1)(parantesis2)が一致します。あなたが求めているものになります。

解決策は、「閉じ括弧を除く任意の文字」のマッチングを行うことです

Regex reg=new Regex(@"\(([^\(]+)\)")

これにより、(parantesis1) が最初の一致として検出され、parantesis1 が .Groups[1] になります。

ネストされた括弧ではまだ失敗しますが、正規表現はネストされた括弧の正しいツールではないため、このケースは少し範囲外だと思います。

グループの前に文字列が常に "Likes " で始まることがわかっている場合は、Saves ソリューションの方が優れています。

于 2013-09-05T08:50:03.287 に答える