正则表达式-匹配但排除?

3

我有一个非常简单的任务,需要在字符串中查找和替换特殊字符。我的正则表达式可以工作,但有时字符串中会有斜体标签,我不想替换它们,但是我必须替换独立的“<”和“>”字符,这会导致斜体标签被改变形状。有没有办法让我匹配特殊字符但排除斜体模式?以下是我的代码:

string sampleText = "<i>This should be in italics</i> but this ¶ character needs to be removed"; 
string sPattern = "[―&<>♫♪–‧₢₳-⅓⅟□¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶•¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕ×ØÙÚÛÜÝÞßàáãäåæçèéêëìíîïðñòóôö÷øùüýþÿŒœŠšŸŽžƒ˜-‰›¢€°]";
string replacePattern = "";

string text = System.Text.RegularExpressions.Regex.Replace(sampleText, sPattern, replacePattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase);

当我的程序执行时,我得到了这个结果:
iThis should be in italics/i but this character needs to be removed

那么,我是否可以匹配我的特殊字符,但是排除斜体标签?如果这不可能,我唯一能想到的解决方案是使用一些字符串处理删除斜体标签,然后用我的正则表达式验证结果,然后把斜体标签放回去。有什么建议吗?

看起来匹配你想要保留的东西比匹配你想要删除的东西要容易得多。 - Sam Axe
2个回答

4
这里有一个简单的方法:
string sampleText = "<i>This should be in italics</i> but this ¶ character needs to be removed"; 
string sPattern = "(</?i>)|[―&<>♫♪–‧₢₳-⅓⅟□¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶•¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕ×ØÙÚÛÜÝÞßàáãäåæçèéêëìíîïðñòóôö÷øùüýþÿŒœŠšŸŽžƒ˜-‰›¢€°]";
string replacePattern = "$1";

string text = Regex.Replace(sampleText, sPattern, replacePattern, RegexOptions.IgnoreCase);

Console.WriteLine(text); 
// <i>This should be in italics</i> but this  character needs to be removed

但是这只适用于标签。您可以轻松地将其扩展到其他标签(例如,"(</?\w+>)|..." 适用于没有属性的任何简单标签),但如果您的标签比这更复杂,我建议先将输入解析为XML,然后仅对您感兴趣的节点文本应用模式。

0

您可以使用这个:

string sPattern = @"(?i)[^<>a-z0-9\s\p{P}]+|<(?!/?i>)|(?<!</?i)>";
string replacePattern = "";

(您可以将\ p {P}替换为要保留的标点符号)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接