正则表达式 - 检查textarea中是否包含匹配项?

时间:2011-09-10 17:27:00

标签: c# regex

我正在编写一个系统,用户可以看到的所有内容都是可翻译的。这意味着每个段落,标题,链接文本,工具提示等都包含在数据库表中,我使用标记来获取数据。例如,[Tag 1]可以是登录,也可以更改为其他内容 - 它可以由公司自己定义。

我的工作非常完美。我重写了Page类中的Render方法来替换所有这些标记。我有一个正则表达式匹配格式为[tag x]的所有标签,其中x是1或更多数字,即数据库中翻译的ID;我正在使用的正则表达式是@"\[(Text|Tag) ([0-9]*)]

我遇到的问题是,例如,如果您在标记中有标记 - 例如[tag 69]定义为[tag 70][tag 71][tag 72] - 当文本位于文本区域内时,它仍会被替换,所以标签69将显示为另外3个放在一起。我想阻止替换textareas中包含的标签。我的第一个想法是,这很容易 - 但后来我意识到如果你有<textarea>[tag 1]</textarea>[tag 2]<textarea>[tag 3]</textarea>,标签2将不会被替换。

我必须承认我不是正规表达的专业人士 - 我想成为现在,但我现在没有时间在我的手上。任何人都可以提出一种方法,我可以实现我想要实现的目标吗?提前谢谢。

此致 理查德

1 个答案:

答案 0 :(得分:1)

所以问题是如何匹配未包含在textarea中的[Tag n]?你可以使用负面的后视。

(?<!\<textarea\>)\[(tag|text) [0-9]+\]

代码:

var input = "<textarea>[tag 1]</textarea>[tag 2]<textarea>[tag 3]</textarea>";
Regex regex = new Regex(@"(?<!\<textarea\>)\[(tag|text) [0-9]+\]");

var matches = regex.Matches(input);
foreach (var match in matches)
{
   Console.WriteLine(match);
}

输出:

[tag 2]