2013-11-26 4 views
1

У меня есть сгенерированный код несколько какИзвлечение подстроки между двумя символами в строке C#

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

Я хочу получить everythng, который между символами $. Как я могу продолжить?

Я знаю, что это можно сделать, используя .Split Но это дает окончательный ответ после долгих джунглей со строками.

Я хочу знать, если есть способ сделать это проще.

+4

«Но это дает окончательный ответ после долгих путаниц со струнами». ??? – nphx

+2

'Я хочу получить все, что находится между знаками $' -> 'string.Split()' будет работать для вас ** если ** у вас есть еще несколько требований ... –

+1

Обратите внимание, что '+' и ') * 50 + 'также находятся между' '' знаками '. – 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 поддержка Regex находится в библиотеке System.Text.RegularExpressions, поэтому вам придется ссылаться на нее в своем коде.

Вот простой пример:

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

Я получаю сообщение об ошибке, поскольку непризнанная escape-последовательность и знаки $ подчеркнуты. Y так? –

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

Это Regex соответствует буквально $ символ с помощью «\$» затем один или больше символов, чем не являются $ с помощью «[^\$]+», а затем еще $ с помощью «\$» еще раз.

Он окружает бит между ними, используя круглые скобки «([^\$]+)», чтобы сделать группу Regex Group, которую легко захватить.

Там уже будет по умолчанию Regex группы А (т.е. весь матч), так что мы захватываем Группу по индексу 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

Вот простой метод без каких-либо Regex:

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

Pre и Post символы, возможно, быть char.MinValue, что означает начало строки или строки концовки.

Смежные вопросы