2013-04-24 3 views
2

이 매우 긴 cfg 파일이 있는데 특정 문자열로 시작하는 줄의 최신 항목을 찾아야합니다. cfg로 파일의 예 :특정 문자열로 시작하는 모든 행을 일치시키는 정규식

... 
# format: - search.index.[number] = [search field]:element.qualifier 
...  
search.index.1 = author:dc.contributor.* 
... 
search.index.12 = language:dc.language.iso 
... 
jspui.search.index.display.1 = ANY 
... 

나는 search.index.[number], 더 구체적으로 시작하는 줄의 마지막 발생을 얻을 수 있어야합니다 : 그 번호가 필요합니다. 위의 내용은 입니다.

보시다시피 그 패턴을 포함하는 다른 줄이 있지만 이 아니고과 일치해야합니다.

Groovy를 프로그래밍/스크립팅 언어로 사용하고 있습니다.

도움을 주시면 감사하겠습니다.

+0

내가 좋아하는 무언가가 내기 "lastIndexOf에서도이()" –

답변

1

10 Here is an explanation page. 당신이 시도 유무 :

def m = lines =~ /(?m)^search\.index\.(\d+)/ 
m[ -1 ][ 1 ] 
+0

매력처럼 작동합니다. 고맙습니다! 오후 8시 30 분 P.S. 어쩌면 대답을 좀 더 명확히 할 수 있을까요? 그것은 효과가 있지만, 왜 나에게 조금 불분명합니다. –

+1

'(? m)'은 Groovy에게 여러 줄 정규 표현식 일치를하도록 지시 한 다음, 마지막 일치를 얻기 위해'm [-1]'이 그것을 알려주고,'[1]'이 마지막 그룹에서 첫 번째 그룹을 얻습니다 시합. 그래서 당신의 예제에서,'m [0] [1]'은 첫 번째 매치'1'이고'm [-1] [1]'은 마지막 매치'12'가 될 것입니다. –

+0

고마워요. 어쩌면 다른 사람에 대한 정규식에 관한 더 많은 정보 : '^'은 줄의 시작 부분에 있다고 말하면'(\ d +)'는'search.index.' 다음에 숫자가 오도록합니다. –

1

나는 당신이 그걸 가져 가야한다고 생각하지 않지만 ...
여러 줄 검색 (어쨌든 여기서해야 함)을 할 수있는 유일한 방법은 파일을 뒤로 읽는 것입니다. 따라서 먼저 .* (om nom nom)으로 모든 것을 먹습니다 (모두 일치하는 도트로 만들 수있는 경우 (?:.|\s)*). 이제 귀하의 패턴 search\.index\.(\d+)과 일치하십시오. 그리고이 패턴을 줄 시작 부분에 일치 시키려면 (?:^|\n) (새 줄 문자로 \n을 사용하지 않는 미친 형식을 사용하지 않기를 바란다).

그래서 ...

(?:.|\s)*(?:^|\n)search\.index\.(\d+) 

수는 1 일치하는 그룹에 있어야합니다. (Test in JavaScript)

추신 : 나는 잘 모르겠다. 정말 적절하지 않다면 미안해.

편집 :
이 또한 작동합니다 :

search\.index\.(\d+)(?!(?:.|\s)*?(?:^|\n)search\.index\.\d+) 
+0

가 매우 빠른 답장을 보내 주셔서 감사합니다! (전체 버전이 StackOverflowError를 부여했기 때문에)'(? :^| \ n) search \ .index \. (\ d +)'와 같이 약간 변형 된 버전에서 정규식을 시험해보고 있습니다. 그것이 효과가있는 것처럼 보인다! 제 목적을 위해 약간의 조정이 필요합니다. 대단히 감사합니다 (해답 + 설명)! –

+0

P. 더 많은 담당자가 있다면 당신의 대답을 upvote 줄 ... : D –

+0

@Dreamonic 그게 아무것도보다 정보에 대한 더했다. 나는 시스템을 "해킹"하여 하나의 정규식으로 할 수 있다는 것이 재미 있다는 것을 알게되었다.) – Loamhoof

1

는 표현으로이 시도 :

^search\.index\.(\d+)/ 

그리고 멋져요 당신은 당신의 결과를 얻을 수 있습니다

matcher[0][0] 
+0

다중 행 모드가 아니기 때문에 어떤 것도 일치하지 않는다. 그리고 일치한다면 ('search.index.1 = author : dc.contributor.*'는 첫 번째 줄에있었습니다), 그룹에 의해 검색되는 번호가 아닌'search.index.1 '을 반환합니다. –

+0

어떤 이유인지 groovy.codehaus.org에 대한 링크가 끊어졌습니다 . 최신 링크 http://docs.groovy-lang.org/latest/html/api/org/codehaus/groovy/runtime/DefaultGroovyMethods.html은 "지원 중단 될"정규 표현식을 나타냅니다. 여전히 ... 확실한 대답. – MarkHu

관련 문제