2012-10-25 1 views
4

단어 내에서 알 수없는 위치에서 선택적으로 하이픈을 넣고 연속 된 줄로 분할 할 수있는 주어진 단어에 대해 텍스트 파일을 검색하려고합니다.임의의 위치에서 하이픈으로 연결된 특정 단어를 일치시키고 두 줄에 걸쳐 분할하는

예 : 내 일치 "하이픈"

This sentence contains a hyphena- 
ted word. 

가장 가까운 (매력) 솔루션 :

"h\(-\s*\n\s*\)\?y\(-\s*\n\s*\)\?p\(-\s*\n\s*\)\?h\(-\s*\n\s*\)\?e\(-\s*\n\s*\)\?n\(-\s*\n\s*\)\?a\(-\s*\n\s*\)\?t\(-\s*\n\s*\)\?e\(-\s*\n\s*\)\?d" 

나는 강한 몇 가지 정규식-foo는 내 명확하게 단어의 존재를 포함하는 정규 표현식을 마련 할 수있는 것보다 바라고 검색 한 즉,. 거기에 "하이픈이 찍힌"것을보고 싶습니다.

"{prefix-of:hyphenated}{hyphen/linebreak}{suffix-of:hyphenated}" 

나는 문서를 사전 처리하는 등의 단어를 축소 실현 : (그것은 "HY-테드 '와 일치하는 것이기 때문에, 어쨌든 버그가 될 것이다) 나는 다음과 같은 일을 인코딩하는 방법을 발견하지 않았습니다 검색을 더 간단하게 만들지 만 관련 도구로 인해 가능하지 않은 상황에서 사용할 수있는 정규식을 찾고 있습니다.

답변

0

나는 이것이 효과가있을 것이라고 생각한다. 검색 할 단어가 많으면 검색 패턴을 생성하는 스크립트를 작성하는 것이 좋습니다.

[h\-]+\s*[y\-\s]+[p\-\s]+[h\-\s]+[e\-\s]+[n\-\s]+[a\-\s]+[t\-\s]+[e\-\s]+d\b 

사용중인 언어를 언급하지 않았지만 .Net으로 테스트했습니다.

여기 검색 패턴을 생성하는 간단한 파이썬 스크립트입니다 :

# patterngen.py 
# Usage: python patterngen.py <word> 
# Example: python patterngen.py hyphenated 

word = sys.argv[1] 
pattern = '[' + word[0] + r'\-]+\s*' 

for i in range(1,len(word)-1): 
    pattern = pattern + r'[' + word[i] 
    pattern = pattern + r'\-\s]+' 

pattern = pattern + word[-1] + r'\b' 
print pattern 
+1

그것은 OP의 노력보다 나을 것이 거의 없습니다. 나는 우리가 좀 더 정교한 것을 찾고 있다고 생각한다. – Bohemian

1

hy-phen-ated도 일치해야 점을 감안하면,이 혼자 정규식 갈 올바른 방법이 아닌 경우라고 생각합니다.

나는 이렇게 (언어를 모르고, 내가 의사 코드를 사용했습니다) 것 :

  1. .*hyphenated.*

모든 언어로 입력에서

  • 경기 청소 입력을 하이픈과 줄 바꿈을 제거 쉽게 1 단계를 달성 할 수 있으며 코드가 훨씬 더 읽기 쉬울 것입니다.

  • +0

    입력의 전처리가 가능하지 않다는 OP의 요구와 충돌이 여전히 있습니다. 지금은 정규식과 일치 할 수 있지만 입력 텍스트를 전처리 할 수는 없습니다. – famousgarkin

    +0

    추가 세부 사항으로 질문을 혼란스럽게하고 싶지는 않았지만 형식 지정에 관한 현명한 시도와 정규식 검색을 제공하지만 하이픈 연결로 인해 검색 가능성이 깨지는 레거시 앱입니다. – user1775138

    0

    박쥐의 바로이를 접근하는 또 다른 방법은 "슬라이드"이 같은 하이픈입니다 :

    hyphenated|h(-\s*\n\s*)yphenated|hy(-\s*\n\s*)phenated|hyp(-\s*\n\s*)henated|hyph(-\s*\n\s*)enated|hyphe(-\s*\n\s*)nated|hyphen(-\s*\n\s*)ated|hyphena(-\s*\n\s*)ted|hyphenat(-\s*\n\s*)ed|hyphenate(-\s*\n\s*)d 
    

    더 잘 읽지 만이하는 것이 현명 성능을 의미하는 방법을 정말 모르는 당신의 원래 패턴.

    h[hypenatd]{0,9}(-\s*\n*\s)?[hypenatd]{0,9} 
    

    다음이 하나의 결과 내에서 일치 :


    는 또 다른 아이디어는 처음으로이 라인을 따라 패턴으로 검색 범위를 좁힐 수 있습니다.

    사실,이 같은 그룹과 일치하는 경우 내가 틀리지 않는 경우 :

    (h[hypenatd]{0,9})(?:-\s*\n*\s)?([hypenatd]{0,9}) 
    

    는 단어 hyphenated의 발행 수는 모두 일치하는 곳, pseudocodily :

    (match.group1 + match.group2) == "hyphenated"