2012-05-03 3 views
2

У меня есть странная проблема, используя замок NVelocity ...

Если строка шаблона заканчивается символом $, он выдает следующее и исключение:

Lexical error: NVelocity.Runtime.Parser.TokenMgrError: Lexical error at line 1, column 94. Encountered: after : ""

Если я добавляю пробел или любой другой символ в конец строки, он работает так, как ожидалось.

У кого-нибудь есть обходное решение для этого?

Вот пример кода, который воспроизводит проблему:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var result = Merge("The quick brown ${Animal} jumps over the lazy dog$", new List<KeyValuePair<string, string>>() { new KeyValuePair<string, string>("Animal", "fox") }); 

     Console.WriteLine("Success: {0}", result.Key); 
     Console.WriteLine("Message: {0}", result.Value); 
     Console.Read(); 
    } 

    public static KeyValuePair<bool, string> Merge(string template, IList<KeyValuePair<string, string>> data) 
    { 
     var ret = new KeyValuePair<bool, string>(false, null); 
     try 
     { 
      if (data != null) 
      { 
       var engine = new VelocityEngine(); 
       engine.Init(); 

       var context = new VelocityContext(); 
       foreach (var tokenData in data) 
       { 
        context.Put(tokenData.Key, tokenData.Value); 
       } 

       var templateContent = template; 

       var sb = new StringBuilder(); 
       var textWriter = new StringWriter(sb); 

       engine.Evaluate(context, textWriter, String.Empty, templateContent); 

       ret = new KeyValuePair<bool, string>(true, sb.ToString()); 
      } 
     } 
     catch (Exception ex) 
     { 
      ret = new KeyValuePair<bool, string>(false, ex.Message); 
     } 
     return ret; 
    } 
} 
+0

Зачем вам нужно '' 'в конце? – V4Vendetta

+0

Его буквальная строка, на каком-то иностранном языке ... Они не говорят $ 100, говорят 100 $, и строка заканчивается этим утверждением. – HarveySaayman

ответ

2

У вас есть несколько вариантов:

Если вы не имеете никакого влияния на входной строки, которые будут объединены, чтобы убедиться, что они не имеют косую доллара характер, по крайней мере, не для процесс слияния:

Пример:

bool dollarAtEnd = false; 

if (input.EndsWith('$')) 
{ 
    input += " "; 
    dollarAtEnd = true; 
} 

var result = Merge(input, ...); 

if (dollarAtEnd) 
{ 
    result = result.Substring(1, result.Length - 1); 
} 

Если вы можете контролировать входную строку, но только требование, что некоторые из м должны заканчиваться символом доллара, вы можете сделать следующее:

Примера:

"#set($dollar='$')The quick brown ${Animal} jumps over the lazy dog$dollar" 

Или пройти «доллар» в качестве переменного в VelocityContext, а не указывать его рядным.

0

$ обозначает начало имени переменной, если вы хотите использовать $ буквальным, вам нужно, чтобы избежать его \$.

http://velocity.apache.org/engine/devel/user-guide.html#Getting_literal

+0

Да, я подумал, что это будет самое простое решение. Тем не менее, при попытке его все еще не удалось с той же ошибкой. Возможно, есть проблема с парсером/токенизатором NVelocity, которая мешает этому работать в конце буфера. –

+0

Пробовал использовать оба @ "Быстрое коричневое $ {Animal} прыгает через ленивую собаку \ $" И "Быстрое коричневое $ {Animal} перепрыгивает через ленивую собаку \\ $", оба провалились с той же ошибкой. – HarveySaayman

+0

@HarveySaayman Можете ли вы проверить, действительно ли '$$' трюк? – V4Vendetta

 Смежные вопросы

  • Нет связанных вопросов^_^