변수 이름을 사용한 루비 정규식
변수 이름의 값을 기반으로하는 루비에서 정규식 패턴을 생성 / 사용할 수 있습니까?
예를 들어, 우리는 모두 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' )
참고URL : https://stackoverflow.com/questions/2268421/ruby-regular-expression-using-variable-name
'program tip' 카테고리의 다른 글
Storyboard를 사용한 사용자 지정보기 (0) | 2020.08.25 |
---|---|
iPhone에서 프로그래밍 방식으로 메모리 사용량 검색 (0) | 2020.08.25 |
Xcode 4에서 헤더와 구현 파일 사이를 어떻게 전환합니까? (0) | 2020.08.25 |
Android Lollipop, AppCompat ActionBar 사용자 정의보기가 전체 화면 너비를 차지하지 않음 (0) | 2020.08.25 |
UITextView에서 링크 클릭을 차단하는 방법은 무엇입니까? (0) | 2020.08.25 |