помогите создать рандомизацию текста: сейчас делаю так: нажимаем кнопку пишем синонимы из них создается массив строк, а в строку текста вставляется {0} вставляем второй синонимы из них создается еще один массив строк а в строку текста вставляется {1} и так далее из всех массивов строк делается массив массивов потом при конфигурации строки текста берем рандомную строку из 1 го массива потом из второго и т.д. теперь хочу сделать, чтобы пользователь писал что то типа: Вася {Пошел|побежал|ушел}{пить|бухать|уничтожать}{алкоголь|пиво|водку} соответственно надо разделить строку на части в которых синонимы присвоить им номера и потом разделить части на синонимы и создать из них массив строк внимание вопрос: как это сделать проще? если кто ни будь предоставит код на c# будет очень хорошо)
я сейчас вообще не понял что ты написал и как ты хочешь делать свою рандомизацию, но 1) находишь позицию "{" (запоминаешь в sym_start) 2) находишь следующую за 1) знак "}" (запоминаешь в sym_end) 3) берешь получившийся текст вида a|b|c|d.... 4) считаешь в 3) количество знаков "|" (чтобы 2 раза работу не делать, можешь позиции этих знаков сохранить в массив, а можешь не сохранять, но тогда в п.6 прийдется заново их искать, тут уж как тебе нравится) 5) берешь случайное число из диапазона 0 .. 4) 6) 6а) если в 5) выпал 0, то копируешь из 3) до 1-го "|", 6б) если в 5) выпало число, равное количеству знаков "|", то от последнего "|" и до конца 3), 6в) если между ними, то копируешь все от 5) до 5)+1 знака "|" 6г) запоминаешь скопированное в my_word 7) удаляешь из строки символы с sym_start по sym_end, а на позицию sym_start вставляешь my_word Элементарно, Ватсон. P.S. это если у тебя твои группы прямо по тексту растыканы, а не вводятся отдельно. Если же ты хочешь заменить {0}, то соответственно в 1) и 2) ничего запоминать не нужно, а находишь в тексте позицию соответствующего "слова", удаляешь его и на его место вставляй твое my_word
Я вот так написал: PHP: static void Main(string[] args) { Regex rx = new Regex("{(.*?)}"); string raw_input = Console.ReadLine(); foreach (string input in raw_input.Split(' ')) { if (rx.IsMatch(input)) { string[] words = rx.Match(input).Groups[1].Value.Split('|'); Console.Write(" " + words[new Random(Guid.NewGuid().GetHashCode()).Next(words.Length)]); } else Console.Write(" "+input); } Console.ReadKey(); } Вроде требуемую задачу выполняет.
а ты регулярки собираешься использовать даже там, где можно обойтись простым копированием? флаг в руки. я понимаю, что в варианте с регулярками думать не нужно, но алгоритм подробно описывает последовательность действий, необходимых для решения поставленной задачи с минимальными затратами ресурсов и времени. Выполняется он в 20-30 строчек кода, несмотря на всю растянутость в словесном описании. P.S. да, к стати, даже слегонца напрягая извилины на поверхности лежит процедура "extractstrings", но никак не регулярки.
Спасибо ваш код делает как раз то что нужно) xophet: то что вы описали я реализовал в ~30 строк, но регулярками вышло проще и короче
Вроде без регулярок: PHP: string raw_input = Console.ReadLine(); foreach (string input in raw_input.Split(' ')) { try { string[] words = input.Split('{')[1].Split('}')[0].Split('|'); Console.Write(" " + words[new Random(Guid.NewGuid().GetHashCode()).Next(words.Length)]); } catch (IndexOutOfRangeException) { Console.Write(" " + input); } } Console.ReadKey(); try..catch можно заменить на 2 if, но так короче.
Угу, а так же применение фреймворков, плугов под эти фреймворки и типа того - неумение прогать. (сарказм) Необходимо сочитать быстроту(читабельность) написания кода и скорость его выполнения - для каждой цели свои подходы. То-то все быдлокодеры(любые языки верхнего уровня) и не пишут на асме.
Это регэксп-то ресурсоёмкий? Хаха. Ну тогда выбрось свою VS или что там у тебя и сиди пиши в блокноте. Это как раз regex - элементарно. Развелось блин школоты быдлокодеров
Извините, но школотой-быдлокодером вас не обзывали (или я не прав?). На каком основании вы применяете это ко мне? RegExp - если даже не ресурсоемкое средство, так медленнее pos, copy, delete в Delphi это точно. Про такие языки как php я помолчу, потому как там, как мне известно, регулярки - обычное дело, но в Delphi это далеко не так (там даже поддержки регулярок нету по стандартам)
А вы попробуйте взять кусок текста килобайт на 30, и регулярку, которая заведомо не сработает с парой-тройкой знаков "*" в тексте. (хватит даже одного) запускаем. и любуемся загрузкой проца 100% а теперь представьте себе на минуту, что конечному пользователю данного ПО не нужна рандомизация. Ваша регулярка не срабатывает. Прога грузит процессор 100% клиент доволен
Какая такая отладка? да здесь кода 30 строк! короче хотите чудить - вперед. Хоть сервера гугла используйте для замены подстроки в строке =-)
Когда живешь на девятом этаже быстрейший способ спустится вниз - прыгнуть в окно, лифт и тем более лестница это путь быдлокодоров. А регулярные выражения это все происки индусов.
В общем после некоторых тестов и доработок правильнее работает адов алгоритм от xophet работает корректнее и как ни странно быстрее т.к. код от Niades не учитывает нескольких важных деталей таких как: пробела перед {||} может ни быть пробел в {qw qw|qw zx|qw as} тоже может быть а если встретит {} будет долго думать готовый вариант это алгоритм от xophet с некоторыми доработками PHP: private void button1_Click(object sender, EventArgs e) { Regex rx = new Regex("{(.*?)}"); string result = ""; int firstq; int s = Convert.ToInt32(numericUpDown1.Value); int i = 0; while (i < s) { string message = textBox1.Text; while (message.IndexOf("{") != -1) { firstq = message.IndexOf("{"); result = string.Format(result + message.Remove(firstq)); message = message.Remove(0, firstq); int first = message.IndexOf("{"); int end = message.IndexOf("}"); first++; int count = end - first; string random = message.Substring(first, count); string[] words = random.Split('|'); string word = words[new Random(Guid.NewGuid().GetHashCode()).Next(words.Length)]; string rep = Convert.ToString(rx.Match(message)); message = message.Replace(rep, word); } result = string.Format(result + message); textBox2.AppendText(string.Format(result + " \r\n")); result = null; message = null; i++; } }