2011-03-10 5 views
0

C#에서 정규식을 적용해야합니다.C# 정규식 라인 제거

MSH|^~\&|OAZIS||C2M||20110310222404||ADT^A08|00226682|P|2.3||||||ASCII 
EVN|A08 
PD1 
PV1|1|test 

을 그리고 내가 뭘 원하는 단지 (분리 문자로 '|') 3 개 문자가 포함 된 모든 행을 삭제입니다 : 문자열은 다음과 같습니다. 따라서이 경우 'PD1'행 (3 행)을 삭제해야합니다. 정규식에서 가능합니까?

들으 그냥 파일에 대한 핸들을 얻을 임시 출력 파일을 확인하고 라인을 통해 하나 하나 실행되지 왜

+5

이 유형의 경우 [NHapi] (http://nhapi.sourceforge.net/home.php)와 같은 HL7 파서를 사용해야합니다. f 작업. –

답변

0

. 3 개의 문자가있는 행이 있으면 건너 뜁니다. 파일을 메모리에 완전히 저장할 수 있으면 GetLines() 메서드를 사용하여 파일을 한 줄씩 나타내는 문자열 배열을 가져올 수 있습니다.

+0

File.ReadAllLines http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx –

1

다음은 정규 표현식없이 원하는대로 할 수 있습니다.

String inputString; 
String resultingString = ""; 
for(var line in inputString.Split(new String[]{"\n"})) { 
    if (line.Trim().Length > 3 || line.Contains("|")) 
     resultingString += line + "\n"; 
} 

이 파일은 하나의 큰 문자열로 간주됩니다. 그리고 필요한 줄이 제거 된 다른 문자열을 제공합니다.

(또는 당신은 직접 파일을 할 수있는 :.

string[] goodLines = 
    // read all of the lines of the file 
    File.ReadLines("fileLocation"). 
     // filter out the ones you want 
     Where(line => line.Trim().Length > 3 || line.Contains("|")).ToArray(); 

당신은 당신의 파일에 올바른 모든 라인을 가진 문자열 []에 끝낼)

+0

여기서'string' 대신'StringBuilder'를 사용하는 것이 더 좋지 않습니까? – Alex

+1

@Alex, 루프에서 문자열을 만들 때마다, 문자열 연결 대신에'StringBuilder'를 사용해야합니다. 그러나 이것은 관련된 논리를 설명하기위한 간단한 예일뿐입니다. – jjnguy

+0

정규식 솔루션은 훨씬 간단하고 간결합니다. 왜 다르게 제안하겠습니까? –

0

이 정규식이를 식별합니다 귀하의 제외 기준을 충족하는 라인 ^[^|]{3}$ 그렇다면 모든 라인 (데이터 포함)을 반복하고 제외 기준을 충족하는지 확인하는 것입니다. 예를 들면.

foreach(Match match in Regex.Matches(data, @"^.+$") 
{ 
    if (!Regex.IsMatch(match.Value, @"^[^|]{3}$")) 
    { 
    // Do Something with legitamate match.value like write line to target file. 
    } 
} 
0

세 줄은 항상 한 줄에 있습니까? 그렇다면 문자열 시작 부분/문자열 끝 부분을 사용할 수 있습니다.

\A.{3}\z 

\ A는 문자열의 시작이다 :

다음은 문자열에 자신에 의해 세 개의 문자와 일치하는 정규식입니다. \ z는 문자열의 끝입니다. . 모든 문자는, {3} 3

1

발생이 : (?<![|])[^\n]{4}\n 정규식은 그러나 나는 {4} 실제로 {3}해야한다고 생각, 그래서 경우를 전환 해보십시오, 내가 사용하는 온라인 정규 표현식 테스터에 원하는 것을 일치 당신을 위해 작동하지 않습니다.

편집이 : \n[^|\n]{3}\n을 당신이 찾고있는 아마 가까운 :

이것은 또한 작동합니다.

편집 2 :

수는 괄호입니다 확실히 {3}이다, 집에서 테스트했습니다.

0

^- 줄의 시작. 는 w \ - 단어 문자 {3} - 라인

^\w{3}$ 
+0

행에 3 개의 문자가 있고 그 중 하나가 파이프 분리 문자 인 경우에는 처리되지 않습니다. – James

+0

\ w에는 파이프가 포함되어 있지 않습니다. – Paul

0

내가 지금까지 게시 본 적이 솔루션에서 그냥 일반적인 관찰의 끝 - 정확히 3 회 $를 repreated. 원래 질문에는 "에만 3 개의 문자가 포함 된 모든 줄을 삭제하십시오."[필자의 강조]. 말 그대로 "단지 3 자"를 의미 있는지 확실하지 않습니다,하지만 경우에 당신은, 당신은 같은 것을에서 제안 된 솔루션의 논리를 변경할 수 있습니다 않았다

if (line.Trim().Length > 3 ...) 

if (line.Trim().Length != 3 ...) 

에 ... 예를 들어 2 문자가 실제로 유효 할 경우에 대비해. (제안 된 정규식 솔루션에 대한 동일한 아이디어입니다.)

0

질문은 다소 모호합니다. 언급 한 바와 같이

는 대답은 경기 공백을 허용이

(?:^|(?<=\n))[^\n|]{3}(?:\n|$) 같은 것입니다.
따라서 "#\t)"도 삭제됩니다.

는 공백을 허용 doesent
(?:^|(?<=\n))[^\s|]{3}(?:\n|$)
을 사용할 수, 시각 (공백이 아닌)에 문자를 제한합니다.

컨텍스트가 모두 단일 문자열이고 대체 단어가 ''이고 전역 문자입니다. 펄
예 컨텍스트 : s/(?:^|(?<=\n))[^\n|]{3}(?:\n|$)//g

0

이 시도 :

text = System.Text.RegularExpressions.Regex.Replace(
     text, 
     @"^[^|]{3}(?:\r\n|[\r\n]|$)", 
     "", 
     System.Text.RegularExpressions.RegexOptions.Multiline); 
0

당신은 어떤 문자 또는 숫자와 일치합니다 정규식

string output = Regex.Replace(input, "^[a-zA-Z0-9]{3}$", ""); 

[A-ZA-Z0-9]를 사용하여 그것을 할 수 있습니다 {3}은 (는) 정확한 숫자 3과 일치합니다.