[ruby] 변수 이름을 사용한 루비 정규식
변수 이름의 값을 기반으로하는 루비에서 정규식 패턴을 생성 / 사용할 수 있습니까?
예를 들어, 우리는 모두 Ruby 문자열로 다음을 수행 할 수 있다는 것을 알고 있습니다.
str = "my string"
str2 = "This is #{str}" # => "This is my string"
정규 표현식으로 똑같은 일을하고 싶습니다.
var = "Value"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "a test foo"
분명히 그것은 나열된대로 작동하지 않으며, 내가하고 싶은 것을 보여주기 위해 예제로 넣었습니다. 변수의 내용 값에 따라 정규식 일치가 필요합니다.
답변
작동하지 않는다고 생각하는 코드는 다음을 수행합니다.
var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' ) # => "a test foo"
var에 정규식 메타 문자가 포함될 수 있으면 상황이 더 흥미로워집니다. 그렇게하고 해당 matacharacter가 정규 표현식에서 일반적으로 수행하는 작업을 수행하도록하려면 동일한 gsub가 작동합니다.
var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"
그러나 검색 문자열에 메타 문자가 포함되어 있고이를 메타 문자로 해석 하지 않으 려면 다음과 같이 Regexp.escape를 사용하십시오.
var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"
또는 정규식 대신 gsub에 문자열을 제공하십시오. MRI> = 1.8.7에서 gsub는 문자열 대체 인수를 정규 표현식이 아닌 일반 문자열로 취급합니다.
var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"
(예전에는 gsub에 대한 문자열 대체 인수가 자동으로 정규 표현식으로 변환되었습니다. 1.6에서 그랬다는 것을 알고 있습니다. 어떤 버전이 변경 사항을 도입했는지 기억하지 못합니다).
다른 답변에서 언급했듯이 보간 대신 Regexp.new를 사용할 수 있습니다.
var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"
답변
작동하지만 gsub!
다른 변수에 반환 값을 사용 하거나 할당 해야 합니다.
var = "Value"
str = "a test Value"
str.gsub!( /#{var}/, 'foo' ) # Or this: new_str = str.gsub( /#{var}/, 'foo' )
puts str
답변
예
str.gsub Regexp.new(var), 'foo'
답변
Ruby에서 변수를 통해 정규식을 사용할 수 있습니다.
var = /Value/
str = "a test Value"
str.gsub( /#{var}/, 'foo' )
답변
str.gsub( Regex.new("#{var}"), 'foo' )