2009-03-03 4 views
1

내 프로젝트에서 사용해야하는 일반 정규식의 정규식 어셈블리를 만들고 싶습니다. 이 정규식을 사용하여 패턴을 일치시키고이를 대체합니다. 어셈블리를 만드는 코드 조각을 사용합니다.컴파일 된 정규식 바꾸기

AssemblyName an = new AssemblyName("MyRegExp"); 

RegexCompilationInfo[] rciList = { 
    new RegexCompilationInfo(@"\<b\>(.+?)\<\/b\>", RegexOptions.IgnoreCase, "BoldCode", "MyRegExp", true), 
    new RegexCompilationInfo(@"\<i\>(.+?)\<\/i\>", RegexOptions.IgnoreCase, "ItalicCode", "MyRegExp", true) 
}; 

Regex.CompileToAssembly(rciList, an); 

하지만 대체 문자열을 지정할 위치를 찾을 수 없습니다. 실제로이 정규 표현식을 사용하여 html 파일의 태그를 바꿉니다. 따라서 대체 문자열도 일정합니다.

다른 호출 어셈블리에서 항상 동일하기 때문에 호출 어셈블리가 바꾸기 문자열을 지정하는 것을 원하지 않습니다. 어떤 조언에 미리

감사합니다,

파비안

EDIT1 :

어쩌면 내가해야 할 일을 misexplained. 나는 항상 같은 패턴으로 대체되는 몇 가지 정규 표현식을 가지고있다. 모든 문자열을 문자열로 바꾸고, 문자열을 문자열로 바꿉니다.

컴파일 된 정규 표현식은 훌륭하지만 컴파일 된 어셈블리의 대체 패턴이 누락되었습니다. 필자는 Helper 클래스를 사용하여 Tranformation의 배열을 만드는 방법으로 문제를 해결했습니다.

내 초기 질문이 더 :이 방법은 컴파일 된 정규식에서 대체 문자열을 지정할 수 있습니까?

답변

2

"CompileToAssembly"메소드에서 직접 지원되는 것처럼 보이지 않으므로 대체 문자열을 정규식과 연결하는 다른 방법을 찾아야합니다. 생성 된 어셈블리에 대체 문자열을 저장하려면 사용자 지정 특성 ("CompileToAssembly"의 세 번째 매개 변수)에 지정해야합니다.

나는이 사용자는 (단일 정규 표현식에 대한되지 않고) 어셈블리 속성을 생성 생각하지만, 당신은 예를 들어 같은 것을 사용할 수있다 (참고 :이 자신을 속성 선언해야 할 것) :

[RegexReplaceString("RegexName", "Replacement")] 

응용 프로그램에서 생성 된 DLL을 사용하는 경우, 대체 문자열을로드하고 일부 클래스의 컴파일 된 Regex 객체와 함께 저장하기 위해 일부 처리를 추가해야합니다. 이것은 약간 어려워 보이지만 최소한, 생성 된 DLL에 대체 문자열을 저장해 두는 것이 좋습니다.

+0

좋은 생각, 내가 뭘 찾았는지, 정규식은 컴파일 타임에 교체 문자열을 알고 지원하지 않습니다. 그 동안 모든 것을 처리하는 Helper 클래스를 작성했습니다. –

3

.NET Reflector은 이와 같은 상황에 매우 유용합니다. Regex.CompileToAssembly에 의해 생성 된 어셈블리 살펴보기

만든 형식은 Regex에서 파생됩니다. 그래서 정확하게을 사용하면 Regex 인스턴스가 인라인으로 생성됩니다.


. 편집 질문 : 대답은 것 같습니다 : 생성 된 어셈블리에 지정된 문자열을 포함하는 방법이 없습니다.

그러나 CompileToAssembly을 사용하면 다중 단계 빌드 프로세스 (어셈블리 생성기 만들기, 어셈블리 만들기, 어셈블리 참조)를 의미하므로 다른 내용을 추가하기 위해이 단계를 확장 할 수 있습니다. 정규식 어셈블리를 만들고 교체 문자열 어셈블리를 만든 다음 ilmerge를 사용하여이를 하나로 결합합니다.

+0

나는 나의 초기 질문에 대한 설명을 추가했다. –

관련 문제