문제

우리는 많은 이메일(일반 텍스트)을 구문 분석해야 하는 시나리오를 가지고 있으며, 각 이메일 '유형'은 다양한 플랫폼에 대해 실행되는 스크립트의 결과입니다.일부는 탭으로 구분되어 있고 일부는 공백으로 구분되어 있으며 일부는 아직 알지 못합니다.

앞으로도 더 많은 '형식'을 지원해야 할 것입니다.

다음을 사용하여 솔루션을 찾으십니까?

  • 정규식
  • 간단히 문자열 검색(string.IndexOf 등 사용)
  • 렉스/야크
  • 다른

전체 솔루션은 C# 2.0(바람직하게는 3.5)에서 개발될 예정입니다.

도움이 되었습니까?

해결책

귀하가 언급한 세 가지 솔루션은 각각 매우 다른 요구 사항을 충족합니다.

수동 파싱 (간단한 텍스트 검색)은 가장 유연하고 적응력이 뛰어나지만 필요한 구문 분석이 더 복잡해지기 때문에 매우 빨리 골치 아픈 일이 됩니다.

정규식 중간 지점이며 아마도 여기서 가장 좋은 방법 일 것입니다.강력하면서도 유연성이 뛰어나므로 다른 정규식을 호출하는 코드에서 더 많은 논리를 직접 추가할 수 있습니다.여기서 가장 큰 단점은 속도입니다.

렉스/야크 실제로는 매우 복잡하고 예측 가능한 구문에만 적용되며 컴파일 후 유연성이 많이 부족합니다.구문 분석 중에 파서를 쉽게 변경할 수는 없습니다. 실제로는 변경할 수 있지만 너무 무거워서 대신 정규 표현식을 사용하는 것이 좋습니다.

나도 이게 클리셰인 걸 알아 답변, 그것은 모두 귀하의 정확한 요구 사항에 따라 결정되지만 귀하가 말씀하신 내용에 따르면 개인적으로 정규식 가방을 사용할 것입니다.

로서 대안, Vaibhav가 지적했듯이, 발생할 수 있는 여러 가지 상황이 있고 어떤 상황이 올지 쉽게 감지할 수 있다면 올바른 알고리즘을 선택하는 플러그인 시스템을 만들 수 있으며 해당 알고리즘은 모두 매우 다를 수 있습니다. 하나는 Lex를 사용하는 것입니다. /Yacc는 뾰족한 경우에 사용하고 다른 하나는 더 간단한 경우에 IndexOf 및 정규식을 사용합니다.

다른 팁

정규식.

Regex는 세계 평화를 제외한 거의 모든 것을 해결할 수 있습니다.어쩌면 세계 평화도 마찬가지일 것입니다.

어떤 유형의 문자열 구문 분석을 사용하든 관계없이 플러그형 시스템이 있어야 합니다.따라서 이 시스템은 이메일 유형에 따라 올바른 '플러그인'을 호출하여 구문 분석합니다.

알 수 없는 상황이 발생했을 때 처리할 수 있도록 솔루션을 업데이트할 수 있도록 설계해야 합니다.이메일을 구문 분석하고 결과를 표준 형식으로 반환하는 메서드뿐만 아니라 이메일을 검사하여 파서가 실행될지 여부를 결정하는 메서드도 포함하는 파서용 인터페이스를 만듭니다.

구성 내에서 사용하려는 파서 유형을 식별하고 구성 옵션을 설정하며 파서가 작동할지 여부를 결정하는 식별자에 대한 구성을 설정합니다.해당 어셈블리에 대한 정적 링크가 없더라도 런타임에 형식이 인스턴스화될 수 있도록 어셈블리 정규 이름으로 파서의 이름을 지정합니다.

식별자는 인터페이스도 구현할 수 있으므로 다양한 항목을 확인하는 다양한 유형을 만들 수 있습니다.예를 들어 특정 패턴에 대해 이메일을 구문 분석하는 정규식 식별자를 만들 수 있습니다.주소와 이메일 내용 등을 통해 결정을 내릴 수 있도록 식별자에 최대한 많은 정보를 제공해야 합니다.

알려진 파서가 작업을 처리할 수 없는 경우 작업을 처리할 수 있는 파서 및 식별자 인터페이스를 구현하는 유형으로 새 DLL을 생성하고 이를 bin 디렉터리에 놓습니다.

무엇을 분석하는지에 따라 다릅니다.Regex가 처리할 수 있는 것 이상으로 나는 ANTLR.처음으로 재귀 하강 구문 분석을 시작하기 전에 이와 같은 프레임워크를 사용하기 전에 작동 방식을 조사하겠습니다.MSDN Magazine을 구독하는 경우 처음부터 작성하는 방법에 대한 기사가 있는 2008년 2월호를 확인하세요.

이해하고 나면 ANTLR을 배우는 것이 훨씬 쉬워질 것입니다.다른 프레임워크도 있지만 ANTLR이 가장 많은 커뮤니티 지원과 공개 문서를 갖고 있는 것 같습니다.작가님도 출판하셨네요 최종 ANTLR 참조:도메인별 언어 구축.

Regex는 아마도 당신이 내기하고, 시도하고, 입증할 것입니다.게다가 정규식을 컴파일할 수도 있습니다.

가장 좋은 방법은 RegEx입니다. RegEx는 다른 옵션보다 훨씬 더 높은 수준의 유연성을 제공하기 때문입니다.

당신이 사용할 수 있는 동안 IndexOf 어떤 일을 처리하기 위해 다음과 같은 코드를 작성하는 자신을 금방 발견할 수 있습니다.

if(s.IndexOf("search1")>-1 || s.IndexOf("search2")>-1 ||...

이는 하나의 RegEx 문으로 처리할 수 있습니다.게다가 이런 곳도 많아요 RegExLib.com 문제를 해결하기 위해 정규식을 공유한 사람들을 찾을 수 있는 곳입니다.

@Coincoin이 기본을 다뤘습니다.정규 표현식을 사용하면 읽기 어렵고 유지 관리하기 어려운 코드가 되기 쉽다는 점을 추가하고 싶습니다.Regex는 강력하고 매우 컴팩트한 언어이므로 자주 사용됩니다.

정규식 내에서 공백과 주석을 사용하면 정규식을 더 쉽게 유지 관리할 수 있습니다.Eric Gunnerson이 나를 이 아이디어로 이끌었습니다.여기 .

PCRE를 사용하세요.다른 모든 답변은 2번째로 우수합니다.

귀하가 제공한 정보가 거의 없으므로 Regex를 선택하겠습니다.

하지만 어떤 종류의 정보를 분석하고 싶은지, 무엇을 하고 싶은지 결정이 Lex/Yacc로 바뀔 수도 있습니다.

하지만 이미 문자열 검색으로 마음을 정하신 것 같습니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top