Регулярное выражение для извлечения номера поста и данных из строки - PullRequest
1 голос
/ 12 февраля 2011

Эй, у меня есть огромный текст, который выглядит так

  some_data I POST postdata_1 IV POST postdata_4 III POST postdata_3 II POST postdata_2

Таким образом, данные сообщения имеют соответствующий номер сообщения римской цифрой перед словом «POST».

Я хочу поместить это в теги как

    <post number>
      I
    </post number>

    <post data>
      post_data1
    </post data>

И так далее для каждого поста ..

Может кто-нибудь помочь мне с регулярным выражением для этого? Я использую Ruby

Ответы [ 3 ]

1 голос
/ 12 февраля 2011

Если я хорошо понимаю, это будет работать так, как вы ожидаете:

roman_number = /M{0,3}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})/
regex = /(#{roman_number})\sPOST\s(.+?)(?=\s#{roman_number}\sPOST|$)/
str.scan(regex) do |post_number, post_data|
  ...
end

регулярные выражения римских чисел по paxdiablo, здесь .

0 голосов
/ 13 февраля 2011

Но .. но .. похоже, не нужно регулярное выражение ..


d = 'some_data I POST postdata_1 IV POST postdata_4' +
    ' III POST postdata_3 II POST postdata_2'

def fd
  puts "<post data>\n  #{
      @pd[0..-2].to_a.join ' '
    }\n</post data>\n" if @pd.to_a.length > 1
end

@pd = []
d.split.each_cons(2) do |n, p|
  if p == 'POST'
    fd
    puts "<post number>\n  #{n}\n</post number>\n"
    @pd = []
  else
    @pd << p
  end
end
@pd << ''
fd
0 голосов
/ 12 февраля 2011

Это не очень приятное регулярное выражение, но если я правильно понимаю ваш вклад и требования ... э-э "some_data" следует игнорировать, верно?

strin = "some_data I POST postdata_1 IV POST postdata_4 III POST postdata_3 II POST postdata_2"
while curmatch = strin.match(/ (.*?) POST (.*?) POST/) do
  postnum = curmatch[1]
  postdata = curmatch[2].reverse.sub(/.*? /, '').reverse
  puts "<post number>#{postnum}</post number>"
  puts "<post data>#{postdata}</post data>"
  strin.sub!(" #{postnum} POST #{postdata}", '')
end
curmatch = strin.match(/ (.*?) POST (.*)/)
puts "<post number>#{curmatch[1]}</post number>"
puts "<post data>#{curmatch[2]}</post data>"

Выход:

<post number>I</post number>
<post data>postdata_1</post data>
<post number>IV</post number>
<post data>postdata_4</post data>
<post number>III</post number>
<post data>postdata_3</post data>
<post number>II</post number>
<post data>postdata_2</post data>
...