문자열을 정규식 Ruby로 변환


118

"/ [\ w \ s] + /"와 같은 문자열을 정규식으로 변환해야합니다.

"/[\w\s]+/" => /[\w\s]+/

다음 Regexp과 같은 다른 방법을 사용해 보았습니다 .

Regexp.new("/[\w\s]+/") => /\/[w ]+\//, 유사하게 Regexp.compileRegexp.escape. 그러나 그들 중 어느 것도 내가 예상 한대로 돌아 오지 않는다.

더 나아가 백 슬래시를 제거해 보았습니다.

Regexp.new("[\w\s]+") => /[w ]+/ 그러나 운이 없습니다.

그런 다음 간단하게 시도했습니다.

str = "[\w\s]+"
=> "[w ]+"

탈출합니다. 이제 문자열을 그대로 유지하고 regexp 객체로 변환하는 방법은 무엇입니까?

답변:


149

여기에 작은 따옴표로 묶인 초기 문자열이 필요합니다 ( 이 페이지 참조 ).

>> str = '[\w\s]+'
 => "[\\w\\s]+" 
>> Regexp.new str
 => /[\w\s]+/ 

137

확실하게

  /#{Regexp.quote(your_string_variable)}/

너무 일하고있다

편집 : 정확성을 위해 Regexp.quote에 your_string_variable을 래핑했습니다.


3
같은 방식으로 옵션을 추가 할 수 없다는 것을 알았습니다 /#{your_regex}/#{options}.
pduersteler

Rails에 대해 이야기하고 있다고 생각합니까? options) = 해시이며, 루비 soooo는 동적이지
세르게이 Gerasimov

2
이것은 루비 2.1에서 OP가 요구하는 것을 수행하지 않습니다. "[\ w \ s] +"=> / [w] + /
Luca Spiller

1
대답은 그 시간 모든 것을 : 2,012년에 주어진 것을 참고 완벽했다하세요
세르게이 Gerasimov

4
완벽한 해였습니다.
Naftuli Kay

35

이 메서드는 특별한 의미를 가진 모든 문자를 안전하게 이스케이프합니다.

/#{Regexp.quote(your_string)}/

예를 들어 .는 '모든 문자'로 해석되기 때문에 이스케이프됩니다.

백 슬래시가 특별한 의미를 갖는 일반적인 문자열 보간을 원하지 않는 한 작은 따옴표로 묶인 문자열을 사용하는 것을 잊지 마십시오.


2
+.Regexp에서 해석 될 기호 (예 :)를 포함 할 수있는 문자열 변수를 보호 할 수있는 방법을 설명하기 때문에 좋습니다.
rchampourlier 2014 년

1
이것은 루비 2.1에서 OP가 요구하는 것을 수행하지 않습니다. "[\ w \ s] +"=> / [w \] \ + /
Luca Spiller

@LucaSpiller는 작은 따옴표로 묶인 문자열을 사용해야합니다. 백 슬래시는 큰 따옴표로 묶인 문자열에서 특수 문자로 취급되기 때문에 예를 들어 "\n"개행 문자 '\n'는 아니지만 그렇지 않습니다.
sandstrom

8

% 표기법 사용 :

%r{\w+}m => /\w+/m

또는

regex_string = '\W+'
%r[#{regex_string}]

에서 도움 :

% r [] 보간 된 정규식 (플래그는 닫는 구분 기호 뒤에 나타날 수 있음)


이것은 OP가 Ruby 2.1에서 요구하는 것을 수행하지 않습니다. "[\ w \ s] +"=> / [ws] + /
Luca Spiller

1
@Luca Spiller, 감사합니다. 작은 따옴표를 사용해야합니다. 답변을 업데이트하겠습니다.
BitOfUniverse 2015

5

gem to_regexp 가 작업을 수행 할 수 있습니다.

"/[\w\s]+/".to_regexp => /[\w\s]+/

수정자를 사용할 수도 있습니다.

'/foo/i'.to_regexp => /foo/i

마지막으로 : detect를 사용하여 좀 더 게을러 질 수 있습니다.

'foo'.to_regexp(detect: true)     #=> /foo/
'foo\b'.to_regexp(detect: true)   #=> %r{foo\\b}
'/foo\b/'.to_regexp(detect: true) #=> %r{foo\b}
'foo\b/'.to_regexp(detect: true)  #=> %r{foo\\b/}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.