Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除字符串中分隔符之间的文本(使用正则表达式?)_C#_.net_Regex_Algorithm_String - Fatal编程技术网

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

C# 删除字符串中分隔符之间的文本(使用正则表达式?),c#,.net,regex,algorithm,string,C#,.net,Regex,Algorithm,String,考虑寻找一对匹配的字符集的要求,并删除它们之间的任何字符以及那些字符/分隔符 以下是分隔符集: []方括号 ()括号 ”“双引号 “”单引号 以下是一些应匹配的字符串示例: 给定:结果为: ------------------------------------------- 你好“一些”世界你好世界 给我一些紫色 今天吃十五块(午餐)吃十五块 祝你有一个“美好”的一天 以及一些不应匹配的字符串示例: 不匹配: ------------------ “你好”世界 布朗]公司 奶酪工厂 如果

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

以下是分隔符集:

[]方括号
()括号
”“双引号
“”单引号
以下是一些应匹配的字符串示例:

给定:结果为:
-------------------------------------------
你好“一些”世界你好世界
给我一些紫色
今天吃十五块(午餐)吃十五块
祝你有一个“美好”的一天
以及一些不应匹配的字符串示例:

不匹配:
------------------
“你好”世界
布朗]公司
奶酪工厂
如果给定字符串不包含匹配的分隔符集,则不会对其进行修改。输入字符串可能有许多匹配的分隔符对。如果一组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);
string testString = "[Test 1 [[Test2] Test3]] Hello World";
testString.RemoveFragmentsBetween('[',']');
问题:使用C#如何实现这一点?我倾向于使用正则表达式


奖励:有没有简单的方法来匹配常量或某种列表中的开始和结束分隔符?我正在寻找的解决方案是,如果业务分析师提出新的分隔符集,可以很容易地更改分隔符。

我必须补充一句老话,“您遇到了一个问题,希望使用正则表达式。现在有两个问题。“

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

[.]*(\(|\[|\"|').*(\]|\)|\"|')[.]*
括号、括号和双引号将被转义,而单引号可以单独使用

为了将上面的表达式转换成英语,我允许在匹配分隔符之间匹配表达式的前后任意数量的字符

开放分隔符短语是
(\(\[\\\“\”)

这有一个匹配的结束语。为了在将来使其更具可扩展性,您可以删除实际的分隔符,并将其包含在配置文件、数据库或任何您可以选择的地方。

一个简单的方法是:

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, '.', '^');
将return语句更改为以下内容将避免重复的空格:

return new Regex(" +").Replace(regex.Replace(s, string.Empty), " ");
这方面的最终结果将是:

"Give Purple and "
string input = "Give [Me Some] Purple (And More) Elephants";
string regex = "(\\[.*\\])|(\".*\")|('.*')|(\\(.*\\))";
string output = Regex.Replace(input, regex, "");
Disclamer:单个正则表达式可能比这个更快。

简单正则表达式是:

"Give Purple and "
string input = "Give [Me Some] Purple (And More) Elephants";
string regex = "(\\[.*\\])|(\".*\")|('.*')|(\\(.*\\))";
string output = Regex.Replace(input, regex, "");
对于以自定义方式构建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表达式来基于要匹配的分隔符对象数组或其他东西构建正则表达式。

使用以下正则表达式

(\{\S*\})
这个正则表达式的作用是用您想要替换它的modifiedWord替换所有出现的{word}

一些示例c#代码:

在这样的句子中

Regex-Hero是一个实时{online{Silverlight}正则表达式 测试员

它将只替换{Silverlight},而不是从第一个{括号到最后一个}括号开始。

在此基础上,我创建了一个扩展方法,它也可以用于嵌套替换,如“[test1[[Test2]Test3]]Hello World”:


返回字符串“Hello World”

+1正则表达式似乎可以满足他的需要。只需一个简单的正则表达式。需要替换即可。对于“…现在你有两个问题。”,LOLThis现在可以像“给我一些紫色(和更多的)[大]大象”一样工作(很可能)。这可以通过在上面提供的表达式中使用“.*?”而不是“.*”来解决。OP没有提到“和帽子”。“给我紫色和更多大象”是OP明确要求的。你为什么扭曲他的话并在等式中添加帽子?+1.发现自己回到了这个帖子上,并没有意识到我发布了上述评论!拙劣的幽默尝试。谢谢你的回答。为什么戴帽子?!我想这是我拙劣的幽默尝试;)。很高兴看到这仍然有用。我喜欢这种方法,但如果您有多层中间层,例如:“[[一个字符串]另一个字符串]”将变成“另一个字符串”,则这种方法不起作用当我将此方法放入页面时,会收到一条警告,表明字符串不包含RemoveFragmentsBetween的定义。我猜您已将其放置在未包含的命名空间中。请尝试通过谷歌搜索“字符串不包含扩展名C的定义”;“它不是100%。“[Test1][Test2[Test3]]Hello World”。RemoveFragmentsBetween(“[”,“])返回“]“Hello World”。以下解决方案似乎对嵌套括号更为健壮: