删除字符串中的分隔符之间的文本(使用正则表达式?)

p.c*_*ell 44 .net c# regex string algorithm

考虑要求找到一对匹配的字符集,并删除它们之间的任何字符,以及那些字符/分隔符.

以下是分隔符集:

 []    square brackets
 ()    parentheses
 ""    double quotes
 ''    single quotes
Run Code Online (Sandbox Code Playgroud)

以下是一些应匹配的字符串示例:

 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
Run Code Online (Sandbox Code Playgroud)

以及一些不匹配的字符串示例:

 Does Not Match:
------------------
 Hello "world
 Brown]co[w
 Cheese'factory
Run Code Online (Sandbox Code Playgroud)

如果给定的字符串不包含匹配的分隔符集,则不会对其进行修改.输入字符串可以具有许多匹配的分隔符对.如果一组2个分隔符重叠(即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);
Run Code Online (Sandbox Code Playgroud)

问题:如何使用C#实现这一目标?我倾向于正则表达式.

额外:是否有简单的方法可以在常量或某种列表中匹配这些起始和结束分隔符?我正在寻找的解决方案很容易更改分隔符,以防业务分析师提出新的分隔符集.

Kel*_*sey 43

简单的正则表达式将是:

string input = "Give [Me Some] Purple (And More) Elephants";
string regex = "(\\[.*\\])|(\".*\")|('.*')|(\\(.*\\))";
string output = Regex.Replace(input, regex, "");
Run Code Online (Sandbox Code Playgroud)

至于你想要构建正则表达式的自定义方式,你只需要构建部分:

('.*')  // example of the single quote check
Run Code Online (Sandbox Code Playgroud)

然后将每个单独的正则表达式部分与OR(正则表达式中的|)连接,如我原始示例中所示.一旦你建立了正则表达式字符串,就运行一次.关键是要将正则表达式放入单个检查中,因为在一个项目上执行许多正则表达式匹配然后迭代很多项目可能会看到性能显着下降.

在我的第一个例子中,它将取代以下行:

string input = "Give [Me Some] Purple (And More) Elephants";
string regex = "Your built up regex here";
string sOutput = Regex.Replace(input, regex, "");
Run Code Online (Sandbox Code Playgroud)

我相信有人会发布一个很酷的linq表达式来构建正则表达式,它基于一组定界符对象来匹配或者什么.

  • 现在,这将是(最有可能)预期的"给[我一些]紫色(和更多)[大]大象".这可以通过使用'.*?'来解决.而不是上面提供的表达式中的'.*'. (2认同)

Bry*_*ard 35

一个简单的方法是这样做:

string RemoveBetween(string s, char begin, char end)
{
    Regex regex = new Regex(string.Format("\\{0}.*?\\{1}", begin, end));
    return regex.Replace(s, string.Empty);
}

string s = "Give [Me Some] Purple (And More) \\Elephants/ and .hats^";
s = RemoveBetween(s, '(', ')');
s = RemoveBetween(s, '[', ']');
s = RemoveBetween(s, '\\', '/');
s = RemoveBetween(s, '.', '^');
Run Code Online (Sandbox Code Playgroud)

将return语句更改为以下内容将避免重复的空格:

return new Regex(" +").Replace(regex.Replace(s, string.Empty), " ");
Run Code Online (Sandbox Code Playgroud)

最终结果将是:

"Give Purple and "
Run Code Online (Sandbox Code Playgroud)

免责声明:单个正则表达式可能比这更快.

  • OP没有提及'和帽子'.OP明确要求"给我紫色和更多的大象".你为什么要扭曲他的话并添加帽子? (3认同)

Ale*_*ril 9

我必须添加一句古老的格言,"你有一个问题,你想使用正则表达式.现在你有两个问题."

我想出了一个快速的正则表达式,希望能帮助你朝着你正在寻找的方向前进:

[.]*(\(|\[|\"|').*(\]|\)|\"|')[.]*
Run Code Online (Sandbox Code Playgroud)

括号,括号,双引号被转义,而单引号可以单独存在.

要将上面的表达式放到英语中,我允许之前的任意数量的字符和之后的任何数字,匹配匹配分隔符之间的表达式.

开放分隔符短语是(\(|\[|\"|') 具有匹配的结束短语.为了在将来使其更具可扩展性,您可以删除实际的分隔符并将它们包含在配置文件,数据库或您可以选择的任何位置.

  • 碰到"......现在你有两个问题.",哈哈 (5认同)