C # «между строками» запускается несколько раз - PullRequest
0 голосов
/ 15 сентября 2018

Вот мой код для поиска строки между {} :

var text = "Hello this is a {Testvar}...";
int tagFrom = text.IndexOf("{") + "{".Length;
int tagTo = text.LastIndexOf("}");
String tagResult = text.Substring(tagFrom, tagTo - tagFrom);

tagResult Вывод: Testvar

Это работает только дляодноразовое использование.Как я могу применить это для нескольких тегов?(например, в цикле while)

Например:

var text = "Hello this is a {Testvar}... and we have more {Tagvar} in this string {Endvar}.";

tagResult[] Выход (например, массив): Testvar , Tagvar , Endvar

Ответы [ 5 ]

0 голосов
/ 15 сентября 2018

Я настоятельно рекомендую использовать регулярные выражения для задания.

using System;
using System.Text.RegularExpressions;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var regex = new Regex(@"(\{(?<var>\w*)\})+", RegexOptions.IgnoreCase);
            var text = "Hello this is a {Testvar}... and we have more {Tagvar} in this string {Endvar}.";
            var matches = regex.Matches(text);

            foreach (Match match in matches)
            {
                var variable = match.Groups["var"];
                Console.WriteLine($"Found {variable.Value} from position {variable.Index} to {variable.Index + variable.Length}");
            }
        }        
    }
}

Вывод:

Найден Тествар с позиции 17 до 24

Найден Тагвар с позицииОт 47 до 53

Найден Endvar с позиции 71 до 77

Для получения дополнительной информации о регулярном выражении посетите справочную страницу MSDN:

https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference

и этот инструмент может быть полезен для тестирования ваших собственных выражений:

http://regexstorm.net/tester

Надеюсь, эта помощь!

0 голосов
/ 15 сентября 2018

Это так просто, используя регулярные выражения, просто используя простой шаблон, такой как {([\d\w]+)}. Смотрите пример ниже: -

using System.Text.RegularExpressions;
...
MatchCollection matches = Regex.Matches("Hello this is a {Testvar}... and we have more {Tagvar} in this string {Endvar}.", @"{([\d\w]+)}");
foreach(Match match in matches){
    Console.WriteLine("match : {0}, index : {1}", match.Groups[1], match.index);
}

Он может найти любую последовательность букв или цифр в этих скобках одну за другой.

0 голосов
/ 15 сентября 2018

Есть много способов убрать этого кота, вот несколько:

  • Разделить его на {затем выполнить цикл, разделить каждый результат} и взять элемент 0 каждый раз

  • Разделить на {или}, а затем циклически проходить, принимая только нечетные элементы

  • Настройте существующую логику так, чтобы вы дважды использовали IndexOf (вместо lastindexof).Когда вы ищете a, передайте индекс {как начальный индекс поиска

0 голосов
/ 15 сентября 2018

Я бы использовал Regex шаблон {(\\w+)}, чтобы получить значение.

Regex reg = new Regex("{(\\w+)}");     
var text = "Hello this is a {Testvar}... and we have more {Tagvar} in this string {Endvar}.";
string[] tagResult = reg.Matches(text)
    .Cast<Match>()
    .Select(match => match.Groups[1].Value).ToArray();
foreach (var item in tagResult)
{
    Console.WriteLine(item);
}

c # online

Результат

Testvar
Tagvar
Endvar
0 голосов
/ 15 сентября 2018

IndexOf() имеет другую перегрузку, начальный индекс которой начинает поиск по заданной строке. если вы его опустите, он всегда будет смотреть с самого начала и всегда найдет первый.

 var text = "Hello this is a {Testvar}...";
    int start = 0, end = -1;
    List<string> results = new List<string>();
    while(true)
    {
        start = text.IndexOf("{", start) + 1;
        if(start != 0)
           end = text.IndexOf("}", start);
        else
           break;
        if(end==-1) break;
        results.Add(text.Substring(start, end - start));
        start = end + 1;  
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...