2016-09-08 4 views
0

의 특정 순서에 맞게 = '단어 1', 'word2', 'word3'] 위치 2 = 'word4', '단어 1'] position1정규식은 I 문자열 2 배열을 가정 문자열

텍스트에 존재하는 하위 문자열 # {target} 뒤에 position1 중 하나 또는 position2 또는 둘 다 같은 단어가 오는 지 확인하려면 텍스트/문자열 내부에 넣고 싶습니다. 시각. 마찬가지로 # {target}의 왼쪽과 오른쪽을보고있는 것과 같습니다.

문장의 예를 들어 "보고서를 작성 및 집행 및 이민 서류와 관련하여 내부 시스템 상에 데이터를 입력"대상 단어가 데이터 경우 나는 단어가 남아있는 경우 (입력) 확인 싶습니다 들어 오른쪽 (에)는 배열에 포함되거나 배열의 단어 중 하나가 정규식 일치에 대해 true를 반환하는 경우 어떤 제안? 내가 루비를 사용하고 일부 정규식을 시도했지만 아직 작동하지 않을 수 있습니다. 그 사이의 잠재적 인 특수 문자도 무시해야합니다. 그 중

하나 :

/^.*\b(#{joined_position1})\b.*$[\s,.:-_]*\b#{target}\b[\s,.:-_\\\/]*^.*\b(#{joined_position2})\b.*$/i 

편집 :

(\S+)\s*#{target}\s*(\S+) 

그러나 나는 경우 무엇을 변경할 수 있습니다 : 나는 왼쪽과 오른쪽 단어를 캡처하는 정규식이 방법을 생각

왼쪽 및 오른쪽으로 한 단어 이상을 포착하고 싶습니까?

답변

1

당신은 문자열의 두 배열이있는 경우는, 당신이 할 수있는 것은이 같은 것입니다 :

matches = /^.+ (\S+) #{target} (\S+) .+$/.match(text) 
if matches and (position1.include?(matches[1]) or position2.include?(matches[2])) 
    do_something() 
end 

무엇이 정규식이하는 것은 텍스트에서 대상 단어를 일치 캡처 그룹을 사용하여 옆에 단어를 추출입니다 . 그런 다음 코드는 해당 단어를 배열과 비교하고 올바른 위치에있는 경우 무언가를 수행합니다.

def checkWords(target, text, leftArray, rightArray, numLeft = 1, numRight = 1) 
    # Build the regex 
    regex = "^.+" 
    regex += " (\S+)" * numLeft 
    regex += " #{target}" 
    regex += " (\S+)" * numRight 
    regex += " .+$" 

    pattern = Regexp.new(regex) 
    matches = pattern.match(text) 

    return false if !matches 

    for i in 1..numLeft 
     return false if (!leftArray.include?(matches[i])) 
    end 

    for i in 1..numRight 
     return false if (!rightArray.include?(matches[numLeft + i])) 
    end 

    return true 
end 

다음과 같이 호출 할 수있는 :처럼이의 더 일반적인 버전 보일 수 있습니다

do_something() if checkWords("data", text, position1, position2, 2, 2) 

나는 몹시 관용적입니다 확신 해요,하지만 당신의 일반적인 감각을 준다 어떻게하면 더 일반적인 방식으로 당신이 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것이 NoMethodError를 던지는 이유를 이해하지 못한다 : 정의되지 않은 메쏘드'[] 'for nil : 텍스트가 일치해야하지만 일치하는 NilClass – Vas

+0

타겟 텍스트가 발견되지 않으면 충돌하지 않도록 업데이트했다. –

+0

감사합니다. 정규식 대신 2 개 이상의 인접 단어를 포함 할 수 있습니까? – Vas

관련 문제