2013-11-26 171 views
1

我有一個生成的字符串有點像提取兩個字符之間的子字符串中的C#

($AverAbandCalls$+$TotalInboundCalls$)*50+$TotalOutboundCalls$ 

我想everythng那是$符號之間。我如何繼續?

我知道這可以使用.Split 完成但是,這給了最後的答案後,與字符串很多jungling。

我想知道如果有辦法以更簡單的方式做到這一點。

+4

「但是,在與琴絃混雜在一起後,這給了最終的答案。」 ??? – nphx

+2

'我想得到$ signs' - >'string.Split()'之間的所有東西都可以爲你工作**除非**你有更多的需求... –

+1

請注意'+'和')*在'$'符號之間「也是」+「。 – Corak

回答

4

試試這個正則表達式:

(?:\$).*?(?:\$) 

由於您使用的是.NET,您也可以嘗試balancing groups

(?<open>\$).*?(?<final-open>\$) 

例:

var input = @"($AverAbandCalls$+$TotalInboundCalls$)*50+$TotalOutboundCalls$"; 
var reg = new Regex(@"(?<open>\$).*?(?<final-open>\$)"); 
var matches = reg.Matches(input).Cast<Match>() 
    .Select(m=>m.Groups["final"].Value).ToList(); 

foreach (var item in matches) 
{ 
    Console.WriteLine(item); 
} 

,其輸出:

AverAbandCalls 
TotalInboundCalls 
TotalOutboundCalls 
+1

正是我在找的東西。謝謝。 –

+2

+1爲平衡組。 –

2

使用正則表達式(正則表達式)。這包含對匹配模式的描述 - 在您的情況下,美元符號,一些非美元符號字符和另一個美元符號。

在.NET中,正則表達式支持位於System.Text.RegularExpressions庫中,因此您必須在代碼中引用它。

下面是一個簡單的例子:

string pattern = "\$([^\$]*)\$"; 
var matches = Regex.Matches(input, pattern); 
+0

我得到一個錯誤,因爲無法識別的轉義序列和$符號被加下劃線。是嗎? –

0
string input = "($AverAbandCalls$+$TotalInboundCalls$)*50+$TotalOutboundCalls$"; 
IEnumerable<string> matches = 
     Regex.Matches(input, @"\$([^\$]+)\$") 
     .OfType<Match>() 
     .Select(m => m.Groups[1].Value); 

此正則表達式使用「\$」比則一個或多個字符的字面$字符匹配不是$使用「[^\$]+」,然後另一個$使用「\$」再次。

它使用圓括號「([^\$]+)」圍繞位之間,使其成爲一個易於抓取的正則表達式組。

有將已經是一個默認的正則表達式組(即整場比賽),所以我們搶集團索引1

0

你可以這樣做

using System.Text.RegularExpressions; 
using System; 
public class Test 
{ 
     public static void Main(){ 
       string s = "My name is $Dave$ and I am $18$ years old"; 
       Regex r = new Regex(@"$(.+?)$"); 
       MatchCollection mc = r.Matches(s); 
       Console.WriteLine("Name is " + mc[0].Groups[1].Value); 
       Console.WriteLine("Age is " + mc[1].Groups[1].Value); 
     } 
} 
0

這裏有一個簡單的方法,沒有正則表達式:

string SubstringBetweenSymbols(string str, char preSymbol, char postSymbol) 
    { 
     int? preSymbolIndex = null; 
     int? postSymbolIndex = null; 


     for (int i = 0; i < str.Length; i++) 
     { 
      if (i == 0 && preSymbol == char.MinValue) 
      { 
       preSymbolIndex = -1; 
      } 
      if (str[i] == preSymbol && !(preSymbolIndex.HasValue && preSymbol == postSymbol)) 
      { 
       preSymbolIndex = i; 
      } 
      if (str[i] == postSymbol && preSymbolIndex.HasValue && preSymbolIndex != i) 
      { 
       postSymbolIndex = i; 
      } 
      if (i == str.Length - 1 && postSymbol == char.MinValue) 
      { 
       postSymbolIndex = str.Length; 
      } 



      if (preSymbolIndex.HasValue && postSymbolIndex.HasValue) 
      { 
       var result = str.Substring(preSymbolIndex.Value + 1, postSymbolIndex.Value - preSymbolIndex.Value - 1); 
       return result; 
      } 
     } 

     return string.Empty; 
    } 

前置和後置符號也許是char.MinValue,這意味着字符串或字符串結束的開始。

相關問題