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

时间:2011-09-11 23:39:14

标签: c# regex

好的,所以我昨天打开了this question并很快得到了答案。它有用,或者我认为,所以我把它标记为正确的答案。

但我认为我没有很好地解释这种情况。基本上我在渲染之前正确地获取HTML,解析它并搜索匹配模式[tag|text x]的字符串,其中x是一个数字,两个单词不区分大小写。

但是,如前一个问题所述,如果这些标签位于textarea内,我不想替换这些标签。这意味着,如果它们介于</textarea><textarea...>之间,那么我仍然希望替换它们,但如果它们介于<textarea...></textarea>之间,那么我不会喜欢替换它们。

到目前为止我已经

@"(?<!\<textarea class='tag'\>)\[(tag|text) ([0-9]+)\]"

我试过了

@"(?<!\<textarea.[^>]*\>)\[(tag|text) ([0-9]+)\]"

但这似乎也不起作用。

例如,我想在以下内容中替换textareas之外的任何标签:

[tag 1]
<textarea>[tag 2]</textarea>[tag 3]
<textarea class="bob">Walter [tag 4]</textarea>[tag 5]
<textarea attr-1="fred">Jim [tag 6] Mary</textarea>[tag 7]
[tag 8]

在此示例中,仅应替换标签1,3,5,7和8;不应该使用2,4和6。

有没有人知道我应该如何改变它以实现这一目标?我不是要求任何人为我做所有工作并给我答案 - 我在这里学习。我已经在这几个小时内努力了,所以对此的任何帮助都会很棒!

1 个答案:

答案 0 :(得分:2)

对于前瞻者而言,这种事情通常比看起来更容易。这可以按照您的要求运行:

@"\[(tag|text)\s+(\d+)\](?![^<]*(?:<(?!/?textarea\b)[^<]*)*</textarea>)"

这里的想法是寻找</textarea>代码,但前提是首先遇到<textarea...>代码 - 这就是这一部分:

[^<]*(?:<(?!/?textarea\b)[^<]*)*</textarea>

假设HTML格式正确,那么正则表达式只能匹配textarea元素。将其置于 [tag]之后执行的否定预测会导致textareas中的匹配被拒绝。