2013-08-06 2 views
-2

나는 중첩 된 해시 트리를 가지고 있는데, 각 트리에는 파일이있는 중첩 된 디렉토리와 같은 이름이 들어 있습니다. 런타임에 외국에서 제공 한 regexps를 얻는다면 (분석하고 싶지는 않습니다) 어떻게 일치 항목을 찾을 하위 트리를 찾을 수 있습니까? 해시의 수천이있을 수 있기 때문에 일치하는 경로가 양식문자열이 더 길면 Perl 정규 표현식 부분 일치?

"$x{name}/$x{subdir}{name}/$x{subdir}{subdir}{name}" 

될하지만, 수도, 내가 경우에만이 두 부분 일치의 시도하려는 :

더 나은
"$x{name}" 
"$x{name}/$x{subdir}{name}" 

또는, 첫 번째 부분이 일치하는 경우 /\G.../g과 같은 형식으로 2 번째와 3 번째와 직접 작업을 시도하십시오. 단, 정규 표현식은 한 부분의 다른 부분에서 오는 것입니다. 그리고 부분 일치하는 다른 모든 하위 디렉토리를 조사하기 위해 역 추적이 필요할 것입니다.

PCRE g_match_info_is_partial_match은 내가 원하는 것을 들리지만 그 이름에 "Perl"이 있음에도 불구하고 5.18 소스에도이 내용이 포함되어 있지 않습니다. 그리고 저는 실제로 5.8.0과 호환되는 것을 원합니다.

이 배경에 대한 설명은 makepp에 regexp 구문을 도입했습니다. 우리는 본질적으로 패턴을 위해 그렇게하지만, 쉬운 구문으로 인해 쉽습니다. Google은 어떤 파일을 찾았는지를 저장하고 더 많은 파일이 나타날 때이를 처리 할 수 ​​있습니다. 이렇게하면 메이 프가 규칙의 출력을 트리에 넣기 때문에 나중에 빌드 될 수있는 파일과 일치시킬 수 있습니다.

답변

0

Perl 정규 표현식과 PCRE는 서로 영향을 미치지 만 실제로는 호환되지 않으며 완전히 동일하지 않습니다. Perl은 사용자 정의 정규식 엔진을 사용합니다.

정규식이 일치하거나 일치하지 않습니다. 정규식이 실패한 경우 정규식이 위치를보고하는 방식으로 작성된 경우를 제외하고 일치가 실패한 위치를 알 수 없습니다.

가능한 유일한 솔루션은 각 레벨마다 하나씩 정규식 목록을 요구하는 것입니다.

그렇지 않으면 부분 일치도 작동하는 방식으로 사용자가 정규식을 작성하도록 요구할 수 있습니다.

for ("https://stackoverflow.com/a/", "https://stackoverflow.com/a/b/", "https://stackoverflow.com/a/b/foo/", "https://stackoverflow.com/a/b/foo/bar.txt", "https://stackoverflow.com/a/b/foo/baz.txt", "https://stackoverflow.com/a/bar.txt") { 
    say qq("$_" --), /$regex/ ? "matches" : "doesn't match"; 
} 

출력 : 분명히

"https://stackoverflow.com/a/" -- matches 
"https://stackoverflow.com/a/b/" -- matches 
"https://stackoverflow.com/a/b/foo/" -- matches 
"https://stackoverflow.com/a/b/foo/bar.txt" -- matches 
"https://stackoverflow.com/a/b/foo/baz.txt" -- doesn't match 
"https://stackoverflow.com/a/bar.txt" -- doesn't match 

이 어떤 방법으로 검색 공간을 감소하지 않습니다이 경우, 정규식 qr|foo/bar\.txt$|는 다시

qr|\A/    # anchor at start 
    (?: [^/]*/  )* # match as many directories as neccessary 
    (?: foo/bar\.txt)? # maybe match an ending foo/bar.txt 
\z|x     # anchor at end 

예 것 이 정규식.

응용 프로그램에서 작동하는 방식으로 회전 할 수 있습니다. 앱이 제공하는 보증에 따라 원본 정규식을 "항상"일치하는 것으로 자동 변환 할 수 있습니다.

+0

나는 또한 마지막 문장의 줄을 따라 생각해 왔습니다. 그러나 그것은 정규 표현식을 분석하는 것을 의미 할 것입니다. 모든 멋진 look-aheads와 -behinds를 가진 어려운 작업입니다. 또는 일치하는 문자열에'. *'를 역으로 추가하십시오. 내가 어떻게 가능할 수 있는지는 생각할 수 없다. – Daniel