2016-07-27 2 views
0

У меня есть строка, такие как:Как извлечь групповое соответствие массиву?

<?xml version="xyzt" standalone="112.0" sxcx="xcxc"?> 

Я хочу, чтобы извлечь строку в массив, где каждый элемент является атрибутом строки, такие как [version="xyzt", standalone="112.0", sxcx="xcxc"].

Я пробовал использовать string.scan(/\s\w+="\.*"/) do |block| puts block end, но я не получаю результата .. Пожалуйста, скажите мне, почему и как я могу это сделать.

+0

Ну, что регулярное выражение не ничего в этой строке совпадают. Поэтому нет выхода. –

+0

Я уверен, что вы не хотите соответствовать буквальной точке ноль или более раз. Используйте http://regex101.com, это здорово. –

+3

Пожалуйста, используйте фактический синтаксический анализатор XML (например, [Nokogiri] (http://www.nokogiri.org/)) вместо [синтаксического анализа XML с регулярным выражением] (https://stackoverflow.com/questions/1732348/regex-match -open-теги-кроме-Xhtml-самодостаточный-теги /). –

ответ

0
string[/(?<=\<\?xml).*(?=\?>)/] 
#⇒ 'version="xyzt" standalone="112.0" sxcx="xcxc"' 

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

?[ << string[/(?<=\<\?xml).*(?=\?>)/] << ?] 
#⇒ '[version="xyzt" standalone="112.0" sxcx="xcxc"]' 

Чтобы получить хэш атрибутов:

string[/(?<=\<\?xml).*(?=\?>)/].split(/\s+/) 
           .map { |e| e.split('=') } 
           .to_h 
#⇒ { 
# "standalone" => "\"112.0\"", 
#  "sxcx" => "\"xcxc\"", 
#  "version" => "\"xyzt\"" 
# } 
+0

Он хочет массив атрибутов. –

+0

@SergioTulentsev В самом деле, спасибо. – mudasobwa

+0

Спасибо @mudasobwa –

0
str = '<?xml version="xyzt" standalone="112.0" sxcx="xcxc"?>' 

Я предполагаю, что вы хотите, чтобы произвести массив:

['version="xyzt"', 'standalone="112.0"', 'sxcx="xcxc"'] 

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

arr = str.scan(/[a-z]+\=\S+/) 
    #=> ["version=\"xyzt\"", "standalone=\"112.0\"", "sxcx=\"xcxc\"?>"] 

puts arr 
# version="xyzt" 
# standalone="112.0" 
# sxcx="xcxc"?> 
Смежные вопросы