2008-09-20 6 views
7

정규식이 일치하지 않을 때 주어진 문자열에서 색인 위치를 추출 할 수 있는지 궁금합니다. 내 정규식은 "ABC는"이었고, 나는 "ABD"와 일치하려고하면일치하는 문자열에서 일치하는 문자열의 정규 표현식 색인

예를 들어, 경기는 인덱스에 설명 2.

편집을 실패합니다. 내가 필요한 이유는 내 응용 프로그램의 구문 분석 구성 요소를 단순화 할 수있게하기 위해서입니다. 이 응용 프로그램은 Assmebly 언어 교육 도구로서 학생들이 프로그램과 같은 어셈블리를 작성, 컴파일 및 실행하도록합니다.

현재 정규식을 사용하여 입력 문자열을 토큰으로 변환하는 tokenizer 클래스가 있습니다. 이것은 아주 잘 작동합니다. 예를 들면 :

다음 토큰은 다음과 같은 입력 = "INP : X :"주어진 생산하는 것 토큰 화 :

Token.OPCODE, Token.WHITESPACE, Token.LABEL, Token.EOL 

는이 토큰 그들은 주어진 문장의 문법을 준수하기 위해 분석
을 . 현재 이것은 IF 문을 사용하여 수행되며 성가신 증명입니다. 이 방법의 단점은 자세한 오류 메시지를 제공 할 수 있다는 것입니다. I.E

if(token[2] != Token.LABEL) { throw new SyntaxError("Expected label");} 

성가신 IF 문 대신 정규식을 사용하여 구문을 정의하고 싶습니다. 그러나 이렇게함으로써 상세한 오류 보고서를 반환 할 능력을 잃게됩니다. 따라서 적어도 오류가 발생한 곳을 사용자에게 알리고 싶습니다.

+0

는 내가 알고 싶네 도움이되기를 바랍니다. 컴파일러에 대한 코드를 본 적이 없기 때문에 오류 메시지를 생성하는 코드는 종종 사용자가 수행하는 것처럼 보입니다. – harpo

+0

결국 나는 IF 진술을 계속하기로 결정했습니다. 그러나, 파생 된 Statement 클래스에서 실제 IF 문을 제거하고 대신 IF 검사/예외 예외를 수행 한 기본 Statement 클래스에 CheckSyntax() 메서드를 넣습니다. 이로 인해 많은 코드 중복을 제거 할 수있었습니다. –

답변

4

저는 Colin Younger에 동의합니다. 기존 Regex 클래스에서는 가능하지 않다고 생각합니다.

  1. 는 정규식 클래스의 소스 코드 를 (예를 들어, http://www.codeplex.com/NetMassDownloader 는 닷넷 소스를 다운로드하는) 가져 오기 : 그러나, 나는 당신이 조금 땀을하고자하는 경우가 행할 생각합니다.
  2. 오류 인덱스와 함께 읽기 전용 속성을 갖도록 코드를 변경하십시오.
  3. 코드가 Microsoft의 Regex 을 사용하는지 확인하십시오.
1

예를 들어, 이와 같은 색인은 몇 가지 간단한 경우에만 의미가 있다고 생각합니다.

"ab * c * z"(여기서 *는 모든 문자를 의미 함)와 "abbbcbbcdd"와 같은 정규 표현식을 사용하면 색인이되어야합니다. 내가 그것을 가능하다고 생각하지 않는다 "... abbbcbbc" 는 "abbbc ..."나에 실패 할 수 있습니다 ... mathcing에 사용되는 알고리즘에

+0

왼쪽부터 오른쪽으로가는 첫 번째 인덱스를 원합니다. 귀하의 예제에서 나는 "abbbcbbcdd"정규식이 'z'문자가 필요한 지점까지 잘 일치 할 것이라고 믿습니다. –

0

을 따라 달라집니다,하지만 난 왜 것 흥미입니다 원하는.

+0

이유에 대한 간단한 질문을 추가했습니다. 당신의 대답에 대한 건배 –

0

AFAIK C#이 지원하지 않는 정규식에 포함 된 콜백이 필요하거나 정규식 엔진에 연결되는 것이 바람직합니다. 그렇다하더라도, 역 추적이 필요하다면 어떤 결과를 원하는지 확실하지 않습니다.

0

정규식이 실패한 곳을 알 수없는 것은 아닙니다. 결과적으로 다른 접근 방식을 취할 필요가 있습니다. 문자열을 비교해야합니다. regex를 사용하여 변경 될 수있는 모든 것을 제거하고 변경되지 않는 문자열과 비교하십시오.

동일한 문제가 발생하여 답변을 얻었고 내 솔루션을 찾아야했습니다. 여기있다 :

https://stackoverflow.com/a/11730035/637142

는이 정말 쉽게 밝혀졌다 여부를

관련 문제