正则表达式替换 C# 中的标签

Regex replace tags in C#

我正在用 C# 制作一个小型解析器。

我要解析的字符串是:

Hello [Name] [LastName] how are you? [FirstTime]this is your first time isnt it?[/FirstTime] Bye!

我的 [Name] 和 [LastName] 的 C# 代码是:

  message = message
    .Replace("[FirstName]", user.FirstName)
    .Replace("[LastName]", user.LastName)
bool isFirstTime = user.FirstLogin;

我的问题在[FirstTime] [/FirstTime]之间。如果 isFirstTime 为真,我想保留标签之间的字符串,如果为假,我想丢弃标签内的文本。

知道我该如何解决这个问题吗?

示例结果:

Hello James Bond how are you? this is your first time isnt it? Bye!

编辑:我忘了说示例字符串只是一个很好的示例,字符串是 "user defined" 所以使用 stringbuilder 不会在我的工作案例.

使用此正则表达式模式查找和替换 FirstName 块:

[[FirstTime]](.*)[[/FirstTime]]

那么您的代码可能是:

Regex rgx = new Regex("[[FirstTime]](.*)[[/FirstTime]]");
File.WriteAllText("", rgx.Replace("Hello [Name] [LastName] how are you? [FirstTime]this is your first time isnt it?[/FirstTime] Bye!", "Ali"));

您可以使用字符串生成器class:

StringBuilder builder = new StringBuilder();
builder.Append("Hello ");

//Name
builder.Append(Name);
builder.Append(" ");
builder.Append(LastName);
builder.Append(" How are you? ");

//First time
if(FirstTime){
    builder.Append(" This is your first time isn't it? ");
}

//Bye
builder.Append(" Bye!");

//Convert to string
String sentence = builder.ToString();

这是您可能正在寻找的正则表达式方式:

var FirstLogin = false;
var FirstName = "James";
var LastName = "Bond";
var message = "Hello [FirstName] [LastName] how are you? [FirstTime]this is your first time isnt it?[/FirstTime] Bye!";
message = message
         .Replace("[FirstName]", FirstName)
         .Replace("[LastName]", LastName);
var isFirstTime = FirstLogin;
if (FirstLogin)
    message = Regex.Replace(message, @"\[/?FirstTime\]", string.Empty);
    // Hello James Bond how are you? this is your first time isnt it? Bye!
else
    message = Regex.Replace(message, @"\[FirstTime\].*?\[/FirstTime\]", string.Empty);
    // Hello James Bond how are you?  Bye!

正则表达式解释:

  1. \[/?FirstTime\] - 按字面意思匹配 [FirstTime][/FirstTime]
  2. \[FirstTime\].*?\[/FirstTime\] - 匹配最近出现的 [FirstTime][/FirstTime] 之间的任何文本(不考虑嵌套的 BBtags)。

如果您有嵌套标签,您可以考虑使用 2 个正则表达式:

\[FirstTime\](?:(?!\[/?FirstTime\]).)*\[/FirstTime\]

上面这个将匹配最接近的一对 FirstTime 标签。而下面的可以匹配最远的那些:

\[FirstTime\](?:\[([^]]*)\].*?\[/\]|.*?)*\[/FirstTime\]