Почему каналы не удаляются с помощью "gsub" в Ruby? - PullRequest
2 голосов
/ 30 января 2012

Я хотел бы удалить из notes все, начиная с example_header. Я пытался сделать:

example_header = <<-EXAMPLE
    -----------------
    ---| Example |---
    -----------------
EXAMPLE

notes = <<-HTML
    Hello World
    #{example_header}
    Example Here
HTML

puts notes.gsub(Regexp.new(example_header + ".*", Regexp::MULTILINE), "")

но вывод:

    Hello World
    ||

Почему || не удалено?

Ответы [ 2 ]

7 голосов
/ 30 января 2012

Каналы в вашем регулярном выражении интерпретируются как оператор чередования . Ваше регулярное выражение заменит следующие три строки:

"-----------------\n---"
" Example "
"---\n-----------------"

Вы можете решить свою проблему, используя Regexp.escape, чтобы экранировать строку при использовании ее в регулярном выражении ( ideone ):

puts notes.gsub(Regexp.new(Regexp.escape(example_header) + ".*",
                           Regexp::MULTILINE),
                "")

Вы также можете избежать регулярных выражений и использовать вместо этого обычные строковые методы ( ideone ):

puts notes[0, notes.index(example_header)]
3 голосов
/ 30 января 2012

Каналы являются частью синтаксиса регулярных выражений (они означают «или»). Вам нужно экранировать их обратной косой чертой, чтобы они считались действительными символами для сопоставления.

...