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