У меня есть строка, как этот
ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH
Как получить строку между $
и /$
?
Ожидаемая строка должна быть
ToBeFetched1
ToBeFetched2
У меня есть строка, как этот
ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH
Как получить строку между $
и /$
?
Ожидаемая строка должна быть
ToBeFetched1
ToBeFetched2
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);
}
Вот это будет работать наверняка.
при условии, что вход не начинается с '$ data/$' группа без знака '-' – quetzalcoatl
Использование строковых методов:
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());
Действительно! Я только что вернул его. Контекст .Net имеет значение, поскольку двигатели/диалекты Regex различаются между платформами. – quetzalcoatl
(? < = \ $) [^ $] {1} (? =/\ $)
(< = \ $) - положительный lookbehind: он гарантирует, что игра начнется сразу после $ ($ не включено в матч)
[^ $] {1,} - соответствует символам, отличным от $; {1} вместо *, чтобы гарантировать, что не будет никаких пустых ссылок (для строк lilke "$/$")
(=/\ $?) - положительный предпросмотр: она обеспечивает ваш матч заканчивается прямо перед /$ (/$ не входит в матче)
Поскольку у вас есть «открытые» и «закрыть» маркеры, то регулярное выражение, очевидно, будет построен вокруг этой формы:
[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
. Если вам нужно последнее, просто измените внутреннюю часть [^$]
. Подумайте и выберите то, что вам действительно нужно!
Добро пожаловать в SO. http://whathaveyoutried.com? Пожалуйста, покажите нам, что у вас есть. SO не является службой написания кода, и вы получите лучший ответ, если будете предоставлять доказательства своей работы. См. [Страницы справки] (http://stackoverflow.com/help). – freefaller
Пробовал с этим \ $ ([^ $] *) \/$ – Venkatesh
обновить свой вопрос тем, что вы пробовали. Вы почти там. Возможно, вы можете попробовать: \ $ ([^ $] *) \/\ $ – jbl