2016-09-08 4 views
0

그래서 정규 표현식을 사용하고자하는 문자열이 있습니다.여러 .txt 파일에서 정규식이있는 문자열을 검색하는 방법은 무엇입니까?

regex = "hello(|/n)(/w*)" 

나는 내 쿼리와 일치 할 수있는 문자열이 포함되어 있는지 확인하기 위해 여러 파일을 가지고 있습니다. 이 일 것 같은 뭔가 :

하이 안녕하세요 세계 안녕하세요 .nope 안녕하세요
당신
예 아니오 어쩌면 나는 또한 단지 예를 너무 위, 단지 일치하는 문자열을 반환 할

" 안녕하세요 세상 "과"안녕하세요 ". 어떤 도움을 주시면 감사

/#{regex}/.match(textfile.txt) 

:

: 나는뿐만 아니라과 같이, 변수로 작동하도록 정규식을 받고 그냥 일치하는 문자열이 아니라 전체 라인을 반환 어려움을 겪고있어

+2

포맷 잘하려고 반환하여 더 명확하게하기위한 질문. –

+0

질문에 대한 답 : 저는 리눅스에서'rgrep' (''grep -r'')을 사용하고 싶습니다. 스크립트가 주로 파일을 먹는 것에 관한 것이라면 ruby'ARGF' (https://robots.thoughtbot.com/rubys-argf) 사용을 고려하십시오. – Felix

답변

0

이 같은 것을보십시오 :

regex = 'hello(|\n)(\w*)' 
matches = /#{regex}/.match(textfile.txt).captures 

첫째로, 당신은 \n 등의 특수 기호를 탈출 백 슬래시를 사용해야합니다. 작은 따옴표는 문자 그대로 사용되기 때문에 작은 따옴표를 사용할 수 있지만 큰 따옴표를 사용하면 이스케이프 시퀀스를 평가할 수 있으므로 다음과 같이 두 번 이스케이프 처리해야합니다. regex = "hello(|\\n)(\\w*)"

.captures 캡처 된 그룹. 당신은 단지 단어가 공간/개행 후 캡처하려면이 같은 [] 연산자를 사용 할 수 있습니다

word = /#{regex}/.match(textfile.txt)[2] 

[0] 전체 경기를 반환합니다 [1] 공간/개행 첫 번째 캡처 그룹을 반환 [2]은 "hello"다음 단어를 포함하는 두 번째 캡처 그룹입니다.

0

scan 메서드를 사용하여 가능한 모든 일치 항목을 정규식으로 캡처 할 수 있습니다.

scan 메서드는 캡처하려는 모든 그룹을 캡처하여 배열에 넣을 수 있지만 먼저 정규식을 수정합시다.

regex = "hello(|/n)(/w*)" 
  1. 당신이하지 /\, 사용하고자하는 것입니다, 당신은이 정규 표현식이다 루비 말할 전체 표현식 주위 /를 사용합니다.
  2. "이 아닌 /을 사용하여 나중에 사용하기 쉽습니다. 그렇지 않으면 정규 표현식으로 변환해야합니다.
  3. ()을 사용하면 캡처 그룹을 만드는 것이므로 $1을 첫 번째 그룹으로 사용하고 $2을 두 번째 그룹으로 사용할 수 있습니다. 이것은 scan이 반환 할 것이므로이 경우에는 필요하지 않습니다.
  4. 질문에 따라 hello 다음에 단어를 캡처해야하므로 *은 0 개 이상의 단어 문자를 캡처하는 것을 의미하지 않으므로 +을 사용하여 1 개 이상의 문자를 캡처 할 수 있습니다. 이 정규식과 원래의 문자열로 scan를 실행하면

그래서 당신이

regex = /hello[\s\n]\w+/ 

과 같아야합니다 정규식

str = 'hi hello world hello .nope hello 
you yes no maybe' 

regex = /hello[\s\n]\w+/ 

str.scan(regex) 

["hello world", "hello\nyou"] 
관련 문제