2017-12-19 7 views
0

사이에 모든 것을 제거하는 I 다음 문자열이 있습니다정규식은 두 문자

<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>" 

것은,이 같은 것을 볼 수 있습니다을 그들 사이의 휴식과 앵커 태그의 무리.

개 00.jpg된다 이미지/JPEG |

개-00.jpg : 각 앵커의 텍스트에서 필자는 파이프 문자 및 파일 형식을 제거 할

그리고 정규식 예를 들어, 너무 미래의 모든 파일 형식을 위해 일한다고 :

,

개 01.docx | 응용 프로그램/vnd.openxmlformats-officedocument.wordprocessingml.document는

개 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 /> 

나는 정규식에 아주 좋은 아니지만, 나는 모든 일치에 실패 다양한 조합을 시도

+2

이유'text.Split ("|")는 거기를 [0]'작동하지 않을 것입니다? –

+0

'input.Split ('|') [0]'더 좋겠지 만 딜란 니콜슨이 맞습니다 – Michael

답변

0

업데이트 당신이 정규식 사용할 수 있습니다

: C#을 들어

(?<=<a[^>]*>[^|]+?)\|.*?(?=</a>) 

을 :

your_string = Regex.Replace(your_string, "(?<=<a[^>]*>[^|]+?)\\|.*?(?=</a>)", "", 
    RegexOptions.IgnoreCase | RegexOptions.Multiline); 

그냥이를 사용하여 문자열을 교체 정규식.

+0

질문이 업데이트되었습니다. 나는 앵커의 안쪽 부분만을 원하지 않는다. 파이프 문자와 파일 형식을 제거하려고하지만 문자열의 다른 모든 문자는 그대로 둡니다. – Ciwan

+0

@ Ciwan - 내 대답을 업데이트 해주십시오. –

+0

@ TimSchmelter - 정규식 접근 방식으로 충분하다고 생각합니다. 이것은 한 가지 해결책입니다. –

0

입력 :
dog-00.jpg|image/jpeg

정규식 | 파이프 전에 부분 만 일치합니다
([^|]+)

설명 :
위의 정규 표현식은 첫 번째 파이프 문자가 나타날 때까지 모든 것을 일치시킵니다.

C# 코드 :

var input = @"dog-00.jpg|image/jpeg"; 
var regex = new Regex(@"([^|]+)"); 
var m = regex.Match(input); 
string name = null; 
if (m.Success) 
{ 
    name = m.Groups[1].Value; 
} 

편집 :
이것은 단지 파이프 문자로 문자열을 spliting에 대해, input.Split (또는 .Substring + .IndexOf)와 딜런 니콜슨의 변형은 정규 표현식이 더욱 확대됨에있을 경우 ...

EDIT2 :
정규식이 필요합니까?그렇지 않은 경우, 다음을 시도하십시오

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(); 
} 
+0

고마워요 @ 마이클, 질문을 업데이트했습니다. 내 문자열이 동일하게 유지되기를 바랍니다 (예 : 모든 앵커 태그 ..etc). 파이프와 그 이후에 오는 파일 형식 만 제거하면됩니다. – Ciwan

+0

@Ciwan html 코드를 그대로 유지하는 정규식이 아닌 내 대답을 업데이트했습니다. – Michael

1

복잡한 HTML을 구문 분석하기 위해 정규 표현식을 사용하지 마십시오. HtmlAgilityPack을 사용할 수 있습니다. 내가 대신 정규식의 Contains, IndexOfRemove 같은 문자열 방법을 사용하십시오 :

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