Как разбить точку "." только перед равным "=" в Ruby - PullRequest
2 голосов
/ 23 апреля 2011

Мне нужно разбить строку на период, который предшествует знаку равенства, чтобы присвоить хешу. Например.,

"Project.risksPotentialAfterSum=Pot. aft."

следует разделить следующим образом:

{"Project" =>{"risksPotentialAfterSum" => "Pot. aft."}}

На данный момент я использую str.split(/[\.=]/,2), что имеет проблему со значением, которое следует за знаком равенства. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 23 апреля 2011
str = "Project.risksPotentialAfterSum=Pot. aft."
m = str.match(/\A(?<obj>.+?)\.(?<prop>[^.]+?)=(?<val>.+)/)
#=> #<MatchData "Project.risksPotentialAfterSum=Pot. aft." obj:"Project"

h = { m[:obj]=>{ m[:prop]=>m[:val] } }
#=> {"Project"=>{"risksPotentialAfterSum"=>"Pot. aft."}}

Это регулярное выражение говорит примерно:

  • Начиная с начала строки,
  • найти что-нибудь в одной строке (назовите ее 'obj'), пока не увидите точку,
  • , за которым следует один или несколько символов, которые не являются точками (назовите его «prop»), пока не увидите знак равенства,
  • и назовите все, что следует после знака равенства "val".
2 голосов
/ 23 апреля 2011
ruby-1.9.2-p136 :028 > str
 => "Project.risksPotentialAfterSum=Pot. aft." 
ruby-1.9.2-p136 :029 > split = str.split(/\.|=/,3)
 => ["Project", "risksPotentialAfterSum", "Pot. aft."] 
ruby-1.9.2-p136 :030 > Hash[*[split[0],Hash[*split[1,2]]]]
 => {"Project"=>{"risksPotentialAfterSum"=>"Pot. aft."}} 

Используемые здесь понятия:

  1. Использование | для регулярного выражения с состояниями: соответствует левое или правое |.
  2. Использование оператор сплата
  3. Создание хэша на основе списка.
1 голос
/ 23 апреля 2011

Вместо использования разбиения строк вы можете использовать сопоставление регулярных выражений и захватывать интересующие вас значения.

m = "Project.risksPotentialAfterSum=Pot. aft.".match /(\w+)\.(\w+)=(.*)/

h = {m[1] => {m[2] => m[3]}}
#=> {"Project"=>{"risksPotentialAfterSum"=>"Pot. aft."}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...