nixp.ru v3.0

18 октября 2017,
среда,
01:17:00 MSK

DevOps с компанией «Флант»
Аватар пользователя myst
myst написал 31 октября 2008 года в 13:38 (1012 просмотра) Ведет себя как Череп; открыл 50 тем в форуме, оставил 2987 комментариев на сайте.

есть такой код на Perl:

while ($xhtml =~ /<.*?\s(rendered|test|value)="#\{(.*?securityBean\.perms.*?)\}"(.*?\ssecunote="(.*?)")?/gis) {
    print "* $&\n";
}

В $xhtml целиком лежит XHTML-ка (кому надо, могу прислать, только не палите меня :). Выводит:

* </h:form></div>
            </div>
            </td>
            


<table>
<tr>
<td width=«50%»></td>

</tr>

</table>

</div>
<table class=«cTable» cellpadding=«0» cellspacing=«0»>
<tr>
<td class="padShort padFreeSpace valignMiddle noWrap» width=«1%»></td></td>
<td class="padShort padFreeSpace» width=«49%»></td></td>
<td class="padShort padFreeSpace valignMiddle noWrap» width=«1%»></td></td>
<td class="padShort padFreeSpace noWrap mailINP» width=«49%»></td>

</tr>
</td>
</tr>
<tr>
<td class="padShort padFreeSpace valignMiddle noWrap"></td></td>
<td class="padShort padFreeSpace noWrap"></td></td>
<td class="padShort padFreeSpace valignMiddle noWrap"></td></td>
<td class="padShort padFreeSpace noWrap dateINP» width=«1%» colspan=«3»></td>

</tr>

</table>

</div>
 </div>
</div>

</h:form>
<table class=«cTable»>
<tr>
<td width=«50%»> </td></td>
<td>

</rich:column>

</rich:column>

</rich:column>

</rich:column>

</rich:column>

</ui:define>

</h:outputText>

</rich:column>

</rich:column>

</rich:column>

</rich:column>

rendered="#{securityBean.perms['accounts_ch_password']}» secunote="Change password for account»

Вместо, нужного:

* 
                                rendered="#{securityBean.perms['accounts_ch_password']}" secunote="Change password for account"

А ведь вначале regex стоит «<.*?». Никак не пойму, где косяк…
</td>
</tr>
</table>

</td>
</tr>
</table>

</td>
</tr>
</table>

metal

Насколько въехал:

У тебя ищется до

securityBean


, а должно быть

actionBean
myst

Нет. В моём сообщении Код_2 является концом Код_1. И ищу я именно securityBean.

myst
Curu3MyHg

Думать что-то не получается, но тебя спасёт замена в выражении всех

.*?


на

[^<>]*?
Дмитрий Шурупов

В общем, да. Curu3MyHg-у — +1. И я, myst, тебе говорил о том же в jabber ;-)

Сейчас протестил с файлом. Вот такой код:

while ($xhtml =~ /\<[^\<]*?\s(rendered|test|value)="#\{([^\<]*?securityBean\.perms.*?)\}"([^\<]*?\ssec unote="([^\<]*?)")?/gis) {
    print "* $&\n";
}

Вернул по твоему файлику следующее:

* 
* 
* 
                                       actionMethod="showPhoto"
                                       rendered="#{securityBean.perms['profile_photo_edit']}"
* 
                                      reRender="personBasicInfoPanel"
                                      rendered="#{securityBean.perms['profile_basic_info_edit']}"

Как понимаю, это именно то, что ты хотел увидеть.

myst

Таки да! Но! Так же не должно быть… т.е. '.*?' должно тоже работать. Так-с, надо поковыряться во Фридле.

myst

Итак, согласно Фридлу, *? — нежадный (lazy) квантификатор, что означает, что он остановится, как только совпадёт, и не будет искать максимальное совпадение. Но нигде не сказано, откуда должно начинаться совпадение в таком случае. Поэтому сделаю, как вы предлагаете.

Спасибо за помощь.