2010-01-25 111 views
0

我有一些特殊的字符作爲%1%2大段%3搜索C++設計模式和替換

我需要知道,如果有任何的設計模式,以取代那些有正確的價值觀,創造的最終段。例如: 以下是我的靜態段落。

%1是美麗的國家,%2是%1的首都,%1國家語言是%3。

我通過某些來源獲取%1,%2,%3的值。

回答

0

你能給我們e strstrsscanf可以找到指向半模式的字符串指針(兩者都是c std庫的一部分),但是如何替換,您需要擴展內存塊以適應替換(如果它們更大),看一下grep(對於unix),或者查看一些字符串搜索算法,如Boyer-Moore

您還可以看看google template systempegtl

0

這取決於你的編程語言。在C#(.NET),你可以使用:

var replaced = string.Format("{0} is a {1}", "klausbyskov", "donkey"); 
+0

語言是C++ – Avinash 2010-01-25 17:33:16

1

我不知道是否有這個設計模式,但它看起來像你想加入一些模板到你的應用。模板與jinja 2

例子:

>>> from jinja2 import Template 
>>> template = Template('{{ country }} is a beautiful country!') 
>>> template.render(country='India') 
India is a beautiful country. 

或者只是搜索和替換 ...

+0

回答Q上的標題被改變之前,「C++ ......」;所以隨時downvote .. – miku 2010-01-25 17:42:04

+0

對不起,但我想澄清一點。 – Avinash 2010-01-25 17:43:27

1

你所描述是建立一個解析器。對於像您的問題一樣簡單的事情,您可能希望簡化設計並使用大多數語言中可用字符串的搜索替換機制。

如果你需要更強大的東西(例如,允許「%1」中最後一個字符串),我會考慮使用一個regexCFG引擎,如果這是你計劃使用在現實世界中的東西,因爲處理邊緣情況(如%%1%1%%%1%)可能會變得相當複雜。

0

我沒有完全明白你的問題。但我想你可以看看MessageFormat如何在Java中工作。下面是一個例子 -

int fileCount = 1273; 
String diskName = "MyDisk"; 
Object[] testArgs = {new Long(fileCount), diskName}; 

MessageFormat form = new MessageFormat(
    "The disk \"{1}\" contains {0} file(s)."); 

System.out.println(form.format(testArgs)); 
1

如果這是C++,那麼你已經有幾條路字符串格式化

  1. boost::string algorithms
  2. printf(雖然完全一樣,你想讓它可能無法正常工作。)
  3. std::string::replace(會導致混亂)
+0

或只是提高字符串算法:http://www.boost.org/doc/libs/1_41_0/doc/html/string_algo/usage.html#id1701549 – 2010-01-25 19:19:37

+0

@gf,是的。我真的需要儘快刷新我的提升。多年來沒有使用過它。 – Glen 2010-01-25 20:34:07