【问题标题】:Regex replace tags in C#正则表达式替换 C# 中的标签
【发布时间】:2015-06-24 09:18:03
【问题描述】:

我正在用 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 为真,我想保留标签之间的字符串,如果为假,我想丢弃标签内的文本。

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

示例结果:

你好詹姆斯邦德,你好吗?这是你第一次不是吗?再见!

编辑:我忘了说示例字符串只是一个示例,并且字符串是“用户定义的”,所以在我的情况下使用字符串生成器是行不通的。

【问题讨论】:

  • 为什么是正则表达式?第一部分可以使用String.Format 完成,第二部分可以通过在标志为true 时附加到字符串来完成。
  • 是的,但是 [FirstTime] [/FirstTime] 之后也有文字
  • 你也可以追加...
  • 是的,如果字符串不是动态的 :)
  • 您当然可以使用 Stringbuilder 类,甚至使用动态字符串。这仅取决于您要显示句子的顺序。内容是'a'还是'b'无关

标签: c# regex replace tags


【解决方案1】:

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

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] 之间的任何文本(不考虑嵌套的 BBtag)。

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

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

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

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

【讨论】:

  • 工作得很好,除了这个在嵌套时效果更好:Regex.Replace(message, @"s*[FirstTime](?=((?:[^[]+|[(?!\ /?FirstTime]))*))\1[\/FirstTime]\s", string.Empty);
  • @Caresi:我认为评论吞噬了一些角色。我用更多选项更新了答案。很高兴我的回答对你有用。如果证明对您有帮助,请考虑对答案进行投票。
【解决方案2】:

使用这个正则表达式模式来查找和替换 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"));

【讨论】:

  • .* 不应该是非贪婪的吗? IE。 .*?.
  • 我想知道谁支持它,结果不是预期的:Hello [NamAli Bye![[FirstTime]](.*)[[/FirstTime]] 正则表达式肯定是错误的,而且不仅仅是贪婪。
【解决方案3】:

你可以使用 stringbuilder 类:

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();

【讨论】:

  • 我忘了说我正在解析的字符串是用户定义的,或者说是动态的,所以这不起作用:/
  • 也许它不能完全以这种方式工作,但您可以通过一些逻辑使其与 Stringbuilder 类一起轻松工作!只需用变量/字符串替换硬字符串值。
猜你喜欢
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多