변수 이름을 사용한 루비 정규식


105

변수 이름의 값을 기반으로하는 루비에서 정규식 패턴을 생성 / 사용할 수 있습니까?

예를 들어, 우리는 모두 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"

분명히 그것은 나열된대로 작동하지 않으며, 내가하고 싶은 것을 보여주기 위해 예제로 넣었습니다. 변수의 내용 값에 따라 정규식 일치가 필요합니다.

답변:


184

작동하지 않는다고 생각하는 코드는 다음을 수행합니다.

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"

4
Regexp.escape에 대한 힌트는 내가 필요하다는 것을 몰랐습니다. 감사!
Jeff Paquette 2013 년

regxPlayerVariable = '(. *?) =. *? document \ .getElementById (# {pluginPlayeVariable})'위에서 모두 적용했지만 작동하지 않습니다.
SSP

1
@SSP 별도의 질문으로 문제를 설명하는 것이 좋을 수 있습니다.
Wayne Conrad

13

작동하지만 gsub!다른 변수에 반환 값을 사용 하거나 할당 해야 합니다.

var = "Value"
str = "a test Value"
str.gsub!( /#{var}/, 'foo' )  # Or this: new_str = str.gsub( /#{var}/, 'foo' )
puts str


6

Ruby에서 변수를 통해 정규식을 사용할 수 있습니다.

var = /Value/
str = "a test Value"
str.gsub( /#{var}/, 'foo' )

1
왜 이것이 반대표 만 있는지 잘 모르겠습니다. var변수와 gsub의 첫 번째 매개 변수 에 정규식 슬래시가 필요하지 않더라도 시도해 보았고 작동합니다 .
Tyler Collier

gsub에서 슬래시의 요점은 정규식이 그 자체로 정규식 인 변수를 포함 할 수 있음을 보여주는 것이라고 생각합니다. 변수는 문자열 유형 일 필요가 없습니다 (실제로 Wayne의 답변에 설명 된 이유로 regex가 더 좋습니다).
mahemoff

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.