例如,我有一些“标记化”模板(我将标记称为双括号之间的部分):
var template1 = "{{TOKEN1}} is a {{TOKEN2}} and it has some {{TOKEN3}}";
我想从这句话中提取一个数组,以便得到类似的东西:
Array("{{TOKEN1}}",
" is a ",
"{{TOKEN2}}",
" and it has some ",
"{{TOKEN3}}");
我尝试使用以下正则表达式代码来实现这一目标:
Regex r = new Regex(@"({{[^\}]*}})");
var n = r.Split(template1);
结果是:
Array("",
"{{TOKEN1}}",
" is a ",
"{{TOKEN2}}",
" and it has some ",
"{{TOKEN3}}",
"");
第一个问题是我无法从句子中恢复标记。我只是通过在 Regex 表达式上添加括号来解决这个问题,即使我不确定它为什么会解决这个问题。
我目前面临的问题是当模板上的第一个和/或最后一个词是 "tokens" 时,数组开头和/或末尾的额外空词。为什么会这样?我做错了什么,还是我应该经常检查这两个位置是否有空?
在我的代码中,我需要知道哪个术语来自一个标记,哪个是模板上的固定位置。在这个解决方案中,我将不得不检查每个数组的位置以查找以“{{”开头并以“}}”结尾的字符串,我认为这不是最好的可能性。所以,如果有人想出一个更好的解决方案来分解这些东西,我会很高兴知道的!
谢谢!
编辑:根据要求,我将发布一个简单的示例,说明为什么我需要对标记和文本进行这种区分。
public abstract class TextParts { }
public class TextToken : TextParts { }
public class TextConstant : TextParts { }
var list = new List<TextParts>();
list.Add( new TextToken("{{TOKEN1}}") );
list.Add( new TextConstant(" is a ") );
list.Add( new TextToken("{{TOKEN2}}") );
/* and so on */
这样,我将拥有组成我的字符串的部分列表,并且我将能够将其记录在我的数据库中以允许将来进行操作和替换。事实上,这个 TOKEN 中的每一个都会被一个 Regex 字符串替换。
目标是用户将能够输入诸如“{{SERVER}} 未在端口 {{PORT}} 上侦听”之类的消息,并且我将能够将“{{SERVER}}”替换为[a-zA-Z0-9 ]+
“{{端口}}" 到\d{1,5}
. 说得通?
我希望这会使帖子更清楚。