2013-09-19 2 views
-2

У меня есть строка, как этот

ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH 

Как получить строку между $ и /$?

Ожидаемая строка должна быть

  1. ToBeFetched1

  2. ToBeFetched2

+2

Добро пожаловать в SO. http://whathaveyoutried.com? Пожалуйста, покажите нам, что у вас есть. SO не является службой написания кода, и вы получите лучший ответ, если будете предоставлять доказательства своей работы. См. [Страницы справки] (http://stackoverflow.com/help). – freefaller

+0

Пробовал с этим \ $ ([^ $] *) \/$ – Venkatesh

+2

обновить свой вопрос тем, что вы пробовали. Вы почти там. Возможно, вы можете попробовать: \ $ ([^ $] *) \/\ $ – jbl

ответ

2
Regex r = new Regex(Regex.Escape("-$") + "(.*?)" + Regex.Escape(@"/$")); 
       MatchCollection matches = r.Matches("ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH"); 
      foreach (Match match in matches) 
      { 
       Console.WriteLine(match.Groups[1].Value); 
      } 

Вот это будет работать наверняка.

+0

при условии, что вход не начинается с '$ data/$' группа без знака '-' – quetzalcoatl

1

Использование строковых методов:

string s ="ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH"; 

var results = s.Split('-') 
       .Where(x=> x.StartsWith("$") && x.EndsWith("/$")) 
       .Select(y=> y.Substring(1,y.Length - 3)); 

//Console.WriteLine("string1: {0}, string2:{1}",results.ToArray()); 
+0

Действительно! Я только что вернул его. Контекст .Net имеет значение, поскольку двигатели/диалекты Regex различаются между платформами. – quetzalcoatl

1

(? < = \ $) [^ $] {1} (? =/\ $)

(< = \ $) - положительный lookbehind: он гарантирует, что игра начнется сразу после $ ($ не включено в матч)

[^ $] {1,} - соответствует символам, отличным от $; {1} вместо *, чтобы гарантировать, что не будет никаких пустых ссылок (для строк lilke "$/$")

(=/\ $?) - положительный предпросмотр: она обеспечивает ваш матч заканчивается прямо перед /$ (/$ не входит в матче)

2

Поскольку у вас есть «открытые» и «закрыть» маркеры, то регулярное выражение, очевидно, будет построен вокруг этой формы:

[head-marker: $] [the content you are interested in: anything] [tail-marker: /$] 

так, с добавлением скобок для формирования захвата группы:

$(.*)$ 

Однако две проблемы: * выражения жадный (и вы не хотите, чтобы это было, как вы хотите, возможно, все маленькие матчи) - поэтому он должен быть ослаблен, а также $ специальный символ в регулярном выражении, поэтому он должен быть экранированы:

\$(.*?)/\$ 

это формы почти хорошее выражение. Это будет, однако ложно матч Agains такие входные:

aaaaa/$bbbbb/$ccccc -> bbbbb 

, потому что «голова-маркер» может пропустить слэш и ударил первый знак доллара, что, скорее всего, вы не хотели бы.Таким образом, некоторые просмотра назад было бы полезно здесь:

(?!</)\$(.*?)/\$ 

?!<XXXX инструктирует соответствует только XXXX не предшествуют потенциал матча.

Смотрите также MSDN: Regex syntax and operators

редактирования: на самом деле предложение Арье является гораздо проще, поскольку он не использует захватывая группу. Обратите внимание на небольшую разницу: пример Arie явно фобизирует данные, чтобы они содержали знак доллара, поэтому ABCD$-$ToBeFe$tched1/$- приведет к tched1 не ToBeFe$tched1. Если вам нужно последнее, просто измените внутреннюю часть [^$]. Подумайте и выберите то, что вам действительно нужно!