C# Regex删除两个字符之间的所有内容
我有以下字符串:C# Regex删除两个字符之间的所有内容,c#,regex,C#,Regex,我有以下字符串: "<a href=\"/formentries/formfile/13978\" target=\"_blank\">dog-00.jpg|image/jpeg</a> <a href='/FormEntries/Delete' class='btnDeleteAttachment' data-form-entry-id='366793' data-attachment-id='13978'> [remove]</a><
"<a href=\"/formentries/formfile/13978\" target=\"_blank\">dog-00.jpg|image/jpeg</a> <a href='/FormEntries/Delete' class='btnDeleteAttachment' data-form-entry-id='366793' data-attachment-id='13978'> [remove]</a><br /><a href=\"/formentries/formfile/13979\" target=\"_blank\">dog-01.docx|application/vnd.openxmlformats-officedocument.wordprocessingml.document</a> <a href='/FormEntries/Delete' class='btnDeleteAttachment' data-form-entry-id='366793' data-attachment-id='13979'> [remove]</a><br /><a href=\"/formentries/formfile/13980\" target=\"_blank\">dog-02.png|image/png</a> <a href='/FormEntries/Delete' class='btnDeleteAttachment' data-form-entry-id='366793' data-attachment-id='13980'> [remove]</a>"
“
”
如果您要很好地格式化它,您将看到如下内容:
<a href=\"/formentries/formfile/13978\" target=\"_blank\">dog-00.jpg|image/jpeg</a>
<a href='/FormEntries/Delete' class='btnDeleteAttachment' data-form-entry-id='366793' data-attachment-id='13978'> [remove]</a>
<br />
<a href=\"/formentries/formfile/13979\" target=\"_blank\">dog-01.docx|application/vnd.openxmlformats-officedocument.wordprocessingml.document</a>
<a href='/FormEntries/Delete' class='btnDeleteAttachment' data-form-entry-id='366793' data-attachment-id='13979'> [remove]</a>
<br />
<a href=\"/formentries/formfile/13980\" target=\"_blank\">dog-02.png|image/png</a>
<a href='/FormEntries/Delete' class='btnDeleteAttachment' data-form-entry-id='366793' data-attachment-id='13980'> [remove]</a>
所以我有一堆锚定标签,它们之间有中断。在每个锚文本中,我要删除管道字符和文件类型:
dog-00.jpg | image/jpeg
变成
dog-00.jpg
regex也应该适用于未来的所有文件类型,例如:
dog-01.docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document
变成
dog-01.docx
我仍然需要完整的锚定,因此在删除文件类型后,文本变为:
<a href=\"/formentries/formfile/13978\" target=\"_blank\">dog-00.jpg</a>
<a href='/FormEntries/Delete' class='btnDeleteAttachment' data-form-entry-id='366793' data-attachment-id='13978'> [remove]</a>
<br />
<a href=\"/formentries/formfile/13979\" target=\"_blank\">dog-01.docx</a>
<a href='/FormEntries/Delete' class='btnDeleteAttachment' data-form-entry-id='366793' data-attachment-id='13979'> [remove]</a>
<br />
我不太擅长正则表达式,但我尝试了各种组合,但都无法匹配输入:dog-00.jpg | image/jpeg
仅与管道前面的部分匹配的正则表达式:([^ |]+)
说明:上面的正则表达式匹配所有内容,直到出现第一个管道字符 C#代码: 编辑:
如果这只是关于按管道字符拆分字符串,那么Dylan Nicholson的带有
输入.Split
(或.Substring
+.IndexOf
)的变体可能比正则表达式性能更好
编辑2:是否需要正则表达式?如果没有,请尝试以下操作:
public static string Clean(string input)
{
var sb = new StringBuilder(input);
int m1 = -1, m2 = -1;
for(var i = 0; i < sb.Length; i++)
{
if (sb[i] == '|')
m1 = i;
if (sb[i] == '<')
m2 = i;
if (m1 > -1 && m2 > -1 && m2 > m1)
{
sb.Remove(m1, m2 - m1);
i = m1;
m1 = -1;
m2 = -1;
}
}
return sb.ToString();
}
公共静态字符串清理(字符串输入)
{
var sb=新的StringBuilder(输入);
int m1=-1,m2=-1;
对于(变量i=0;i 如果(sb[i]='更新
您可以使用此正则表达式:
(?<=<a[^>]*>[^|]+?)\|.*?(?=</a>)
(?[^ |]+?)\\\\\.*(?=)
对于C#:
your_string=Regex.Replace(您的_string,(?[^ |]+?)\\\\\\\.*(?=)”,“”,
RegexOptions.IgnoreCase | RegexOptions.Multiline);
只需使用此正则表达式替换字符串。不要使用正则表达式解析复杂的HTML,您可以使用。我还可以使用字符串方法,如包含、索引和删除,而不是正则表达式:
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html); // pass in your HTML string
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
string text = link.InnerText;
if (text.Contains('|'))
link.InnerHtml = text.Remove(text.IndexOf('|')); // you can't modify InnerText directly but this works
}
string result = doc.DocumentNode.OuterHtml; // your desired result
是否存在text.Split(“|”)无法工作的原因?input.Split(“|”)[0]
会更好,但Dylan Nicholson正确地回答了这个问题。我不只是想要锚的内部部分。我想要删除管道字符和文件类型,而是将所有其他内容都保留在字符串中。@TimSchmelter-regex方法我想已经足够了。这是一行解决方案。@karthikselvaraj:一行不总是有效的这还不够。用正则表达式解析动态html不是很可靠。你知道吗?@karthikselvaraj你的代码似乎只返回1个锚,而不是6@Ciwan-我已经测试了代码。请检查-谢谢@Michael,我已经更新了问题。我希望我的字符串保持不变(例如,所有锚定标记..等等),我只想删除管道和其后的文件类型。@Ciwan用一个非正则表达式变量更新了我的答案,使html代码保持不变。。。
your_string = Regex.Replace(your_string, "(?<=<a[^>]*>[^|]+?)\\|.*?(?=</a>)", "",
RegexOptions.IgnoreCase | RegexOptions.Multiline);
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html); // pass in your HTML string
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
string text = link.InnerText;
if (text.Contains('|'))
link.InnerHtml = text.Remove(text.IndexOf('|')); // you can't modify InnerText directly but this works
}
string result = doc.DocumentNode.OuterHtml; // your desired result