请考虑以下要求:找到一对匹配的字符集,并删除它们之间的所有字符 以及 这些字符/定界符。
以下是定界符集:
[] square brackets () parentheses "" double quotes '' single quotes
以下是一些应该匹配的字符串示例:
Given: Results In: ------------------------------------------- Hello "some" World Hello World Give [Me Some] Purple Give Purple Have Fifteen (Lunch Today) Have Fifteen Have 'a good'day Have day
还有一些不匹配的字符串示例:
Does Not Match: ------------------ Hello "world Brown]co[w Cheese'factory
如果给定的字符串不包含匹配的定界符集,则不会对其进行修改。输入字符串可能具有许多匹配的定界符对。如果一组2个定界符重叠(即he[llo "worl]d"),那将是一个边缘情况,在这里我们可以忽略。
he[llo "worl]d"
该算法将如下所示:
string myInput = "Give [Me Some] Purple (And More) Elephants"; string pattern; //some pattern string output = Regex.Replace(myInput, pattern, string.Empty);
问题: 您将如何使用C#实现这一目标?我倾向于正则表达式。
奖励: 是否有简单的方法可以在常量或某种类型的列表中匹配这些开始和结束定界符?我正在寻找的解决方案很容易更改定界符,以防业务分析师提出新的定界符集。
简单的正则表达式为:
string input = "Give [Me Some] Purple (And More) Elephants"; string regex = "(\\[.*\\])|(\".*\")|('.*')|(\\(.*\\))"; string output = Regex.Replace(input, regex, "");
至于要在其中构建正则表达式的自定义方式,您只需要构建以下部分:
('.*') // example of the single quote check
然后像我的原始示例一样,将每个正则表达式部分与一个OR(正则表达式中的|)串联起来。构建完正则表达式字符串后,只需运行一次。关键是使正则表达式成为一项检查,因为对一项执行许多正则表达式匹配,然后遍历许多项可能会导致性能显着下降。
在我的第一个示例中,它将替换以下行:
string input = "Give [Me Some] Purple (And More) Elephants"; string regex = "Your built up regex here"; string sOutput = Regex.Replace(input, regex, "");
我确信有人会发布一个很酷的linq表达式,以根据要匹配的分隔符对象数组来构建正则表达式。