c# - 在 C# 中使用正则表达式拆分字符串上的标记

标签 c# regex split tokenize

例如,我有一些“标记化”模板(我将双括号之间的部分称为标记):

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 表达式上添加括号来解决这个问题,尽管我不确定它为什么能解决这个问题。

我目前面临的问题是数组开头和/或末尾的额外空项当模板上的第一个和/或最后一个项是“标记”时。为什么会这样?我做错了什么,还是我应该经常检查这两个位置是否为空?

在我的代码中,我需要知道哪个术语来自 token ,哪个是模板上的固定位置。在这个解决方案中,我将不得不检查每个数组的位置以查找以“{{”开头并以“}}”结尾的字符串,我认为这不是最好的可能性。所以,如果有人想出更好的解决方案来分解这些东西,我会很高兴知道!

谢谢!

编辑:根据要求,我将发布一个简单的示例来说明为什么我需要对 token 和文本进行这种区分。

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 ]+ 和“{{PORT}}”到 \d{1,5}。有道理吗?

我希望这能让帖子更清晰。

最佳答案

如果您沿分隔符拆分字符串,并且字符串以分隔符开头或结尾,这意味着在第一个/最后一个分隔符之前/之后有一个空元素:

想象一下 CSV 文件中的以下行:

,a,b,c,

该 CSV 行包含元素 """a""b""c"""

您的 {{TOKEN}} 也会发生同样的事情。您可以使用不同的方法:

MatchCollection allMatchResults = null;
Regex regexObj = new Regex(@"\{\{[^{}]*\}\}|[^{}]+");
allMatchResults = regexObj.Matches(subjectString);

如果单个大括号可能出现在标记内或标记之间,您也可以使用

Regex regexObj = new Regex(@"\{\{(?:(?!\}\}).)*\}\}|(?:(?!\{\{).)+");

不过,由于所有前瞻性断言,效率会稍低一些,因此只有在需要时才应使用它。

编辑:我刚刚注意到您的帖子中还有另一个问题:为什么您需要在您的正则表达式周围添加括号以使其“有效”?回答:通常,split() 命令只返回分隔符之间 的内容。如果您将定界符(或其部分)括在捕获括号中,则这些括号内匹配的任何内容也将添加到结果列表中。

关于c# - 在 C# 中使用正则表达式拆分字符串上的标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12875457/

相关文章:

c# - 不同线程上的新表单

javascript - 排除第一项的正则表达式

c# - 从字符串数组创建更大的字符串

linux - 将输出文件拆分为不同的子文件

regex - 在 Google 表格中的列中的所有单元格内的子字符串后求和多个值

c# - 有什么方法可以避免实现 ICommand 以在 MVVM 中使用 Button?

c# - SerializeObject 抛出 System.OutOfMemoryException

c# - VS2012 + CRM 2011 : Microsoft. IdentityModel 引用错误

java - 正则表达式与打印精美的文件不匹配

regex - Perl 正则表达式、单词 anchor 和特殊字符