У меня есть файл с похожими строками, подобными приведенным ниже:
setmessage id=xxx.yyy.1 "text=Your input is not correct."
setmessage id=xxx.yyy.2 "text=Please add a ""Valid from"" date."
setmessage "id=xxx.yyy.3" "text=Another text, but the ID is in quotes too."
Моя цель состоит в том, чтобы разбить этот текст на различные атрибуты:
id => 'xxx.yyy.1'
text => 'Your input is not correct.'
id => 'xxx.yyy.2'
text => 'Please add a ""Valid from"" date.'
id => 'xxx.yyy.3'
text => 'Another text, but the ID is in quotes too.'
В настоящее время я использую this:
function extractAttribute([String] $line, [String] $attribute){
if ($line -like "*$attribute*"){
$return = $line -replace ".*(?=`"$attribute=)`"$attribute=([^`"]*).*|.*$attribute=(.*?)([\r\n].*|$)", "`$1`$2"
if ($return -eq ""){
$return = $null
}
return $return
} else {
return $null
}
}
С этим кодом я могу извлечь один атрибут за раз. Но он не работает с двойными кавычками:
$line = 'setmessage id=xxx.yyy.2 "text=Please add a ""Valid from"" date."'
$attribute = "text"
$result = extractAttribute $line $attribute
Результат:
'Please add a '
, а остальные отсутствуют. Ожидаемый результат должен быть:
'Please add a ""Valid from"" date.'
Кто-нибудь может мне помочь?
Спасибо!
Редактировать: я создал решение для бедняков, заменив плохое двойные кавычки с чем-то еще, затем разделить текст и заменить снова. Не красиво, но работает:
function extractAttribute([String] $line, [String] $attribute){
if ($line -like "*$attribute*"){
$line = $line -replace '""', '~~'
$return = $line -replace ".*(?=`"$attribute=)`"$attribute=([^`"]*).*|.*$attribute=(.*?)([\r\n ].*|$)", "`$1`$2"
$return = $return -replace '~~', '""'
if ($return -eq ""){
return $null
} else {
return $return
}
} else {
return $null
}
}