2015-05-22 6 views
-1

Можете ли вы сказать мне, есть ли способ создать одну строку из другой, используя параметры?Генерировать случайную строку, используя параметры

Например:

{Привет | Привет | Эй}, как ты {сегодня | делать}?

Эта строка является базой для случайно сгенерированной строки, используя эти значения.

Так это может быть:

Здравствуйте, как вы сегодня? или Привет, как дела? или любые варианты.

Есть ли простой способ сделать это?

Главное, что начальная строка не является «фиксированной», поэтому она может быть любой строкой с любыми значениями {.. | ..}, которые могут быть найдены в любом месте этой строки.

+0

Да, это довольно просто, просто нужно разобрать строку ... попробуйте что-нибудь, затем вернитесь, если вы застряли – musefan

+1

Да, есть простой способ сделать это. – Banana

+0

Возможно, вы используете метод тасования, например здесь http://stackoverflow.com/questions/273313/randomize-a-listt-in-c-sharp –

ответ

9

Это может быть что-то вроде этого:

private static Random gen = new Random(); 

    ... 
    String source = "{Hi|Hello|Hey}, how are you {today|doing}?"; 

    String result = Regex.Replace(source, @"\{(\w|\|)*\}", (MatchEvaluator) (
    (match) => { 
     var items = match.Value.Trim('{','}').Split('|'); 

     return items[gen.Next(items.Length)]; 
    })); 
+2

Лично я бы сделал, чтобы OP приложил некоторые усилия для себя, но хорошо сделал, предоставив решение для актуального вопроса;) – musefan

+0

Благодарим вас за отлично работающее решение! – Oleksii

0

Вам нужно будет написать свой собственный двигатель синтаксического анализа, но да - это относительно просто.

Вот довольно наивная реализация, чтобы вы начали:

public string ParseRandomOptionsString(string input) 
{ 
    var random = new Random(); 
    var output = string.Empty; 
    var currentOption = string.Empty; 
    var currentOptions = new List<string>(); 
    var optionsStarted = false; 

    foreach (var c in input) 
    { 
     if (optionsStarted) 
     { 
      if (c == '}') 
      { 
       optionsStarted = false; 
       if (!string.IsNullOrEmpty(currentOption)) 
        currentOptions.Add(currentOption); 

       output += currentOptions[random.Next(currentOptions.Count)]; 
       currentOptions.Clear(); 
       currentOption = null; 
      } 
      else if (c == '|') 
      { 
       if (!string.IsNullOrEmpty(currentOption)) 
        currentOptions.Add(currentOption); 

       currentOption = null; 
      } 
      else 
      { 
       currentOption += c; 
      } 
     } 
     else 
     { 
      if (c == '{') 
      { 
       optionsStarted = true; 
      } 
      else 
      { 
       output += c; 
      } 
     } 
    } 

    return output; 
} 
0

Ответ дается Dmitry Bychenko лучше, но если вы не хотите использовать Regex, В java Вы можете использовать следующие code-

public static void main(String s[]) { 
     System.out.println(meth()); 
      } 
public static String meth(){ 
    String source = "{Hi|Hello|Hey}, how are you {today|doing}?"; 
    List<String> list1=new ArrayList<String>(); 
    List<String> list2=new ArrayList<String>(); 
    String[] strg=source.split("\\{"); 
    for(String str: strg){ 
     if(str.contains("}")){ 
     String[] data=str.split("\\}"); 
     list1.add(data[0]); 
     list2.add(data[1]); 
    } 
    } 
    Random random = new Random(); 
    String[] req=new String[list1.size()]; 
    int i=0; 
    for(String str: list1){ 
     req[i++]= str.split("\\|")[random.nextInt(str.split("\\|").length)]; 
    } 
    int j=0; 
    String result=""; 
    for(String str: list2){ 
     result=result+req[j++]+str; 
    } 
    return result; 
} 
Смежные вопросы