문제

나는 일종의 데이터 객체 (사전을 생각하고 있다고 생각합니다)는 수많은 정규식을 열쇠로 고정시키고, 일련의 텍스트를 가져 와서 사전에서 실제 값을 얻기 위해 그들과 일치해야합니다. . 대규모 데이터 세트를 위해이를 수행하는 효율적인 방법이 필요합니다.

나는 C#에 있고 어디서부터 시작 해야할지 잘 모르겠습니다.

도움이 되었습니까?

해결책

LINQ를 사용하지 않는 이유는 무엇입니까?

Dictionary<string, string> myCollection = new Dictionary<string, string>();

myCollection.Add("(.*)orange(.*)", "Oranges are a fruit.");
myCollection.Add("(.*)apple(.*)", "Apples have pips.");
myCollection.Add("(.*)dog(.*)", "Dogs are mammals.");
// ...

string input = "tell me about apples and oranges";

var results = from result in myCollection
              where Regex.Match(input, result.Key, RegexOptions.Singleline).Success
              select result;

foreach (var result in results)
{
    Console.WriteLine(result.Value);
}

// OUTPUT:
//
// Oranges are a fruit.
// Apples have pips.

다른 팁

당신이 실제로 이것에 대한 정기적 인 표현이 필요한지 확실하지 않습니다 - 당신은 트리. 사전을 나타내는 것은 트리의 일반적인 응용 프로그램입니다. ( "연관 배열"의미가 아니라 단어 목록에서와 같이 사전을 의미한다고 가정합니다).

Regexes와의 문자열과 일치하여 Regex 경기를 받는다는 것을 의미합니까? 아니면 그냥 텍스트 일치? 다시 말해서, 당신이 regexes 중 하나가 될 문자열입니까, 아니면 Regex를 적용하기위한 일부 데이터입니까?

그것이 정규식이고 목록에서 그것을 찾고 싶다면 사전이 필요하지 않으며 2 부 컨테이너입니다. 목록이나 stringCollection 만 사용하고 indexof (mytstring)를 요청할 수 있습니다. -1은 거기에 없음을 의미합니다.

regexps가 사소한 단일 스트링이 아니고 효율성을 관리하는 경우, 당신은 그것들을 단일로 표현하고 싶을 것입니다. NFA (비 결정적 유한 상태 자동 자동, 최종 상태에 값이 있습니다. 입력이 하나 이상의 RegexP와 일치 할 수있는 경우 최종 상태에는 일련의 값이 필요합니다.

이 시점에서 오토 마톤 최적화를 고려할 준비가되어 있습니다. 그것이 실제로 결정될 수 있다면 (이것은 당신에게 NFA보다 기하 급수적으로 더 큰 DFA를 제공한다면), 반드시 그렇게하십시오. DFA가 있으면 효율적으로 (그리고 동형에 이르기까지) 최소화 할 수 있습니다 (그러나 최종 상태에 값이 있기 때문에 명백한 수정 일반적인 알고리즘 필요합니다).

NFA를 직접 최소화하는 기술도 있습니다. 예를 들어, 두 상태에 동일한 접미사 세트가있는 경우 ({(문자열의 나머지, 값)})와 동일하며 결합 할 수 있습니다. acyclic NFA의 동등성을 통해 수행 할 수 있습니다 해시 소싱 최종 상태에서 시작합니다.

REGEX를 한 번 이상 사용할 계획이라면 컴파일 된대로 REGEX 객체를 생성하고 오버 헤드를 줄이기 위해 재사용 할 수 있습니다.

Regex RegexObject = new Regex(Pattern, RegexOptions.Compiled);

이 모델을 사용하면 패턴 문자열이 아닌 Regex 객체를 가장 잘 저장하는 것이 가장 좋습니다.

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