Regexp на C # не находит все совпадения CDATA

1

Я пытаюсь сопоставить:

<script type="text/javascript">
//<![CDATA[
if (typeof(Sys) === 'undefined') throw new Error('ASP.NET Ajax client-side framework failed to load.');
//]]>
</script>

А ТАКЖЕ

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['aspnetForm'];
if (!theForm) {
    theForm = document.aspnetForm;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

Я использую:

regex = new Regex(@"\<script(.*)type=(.*)text/javascript(.*)\>(.*)\/\/\<\!\[CDATA\[(?<text>(.*))\/\/\]\]\>(.*)\<\/script\>", RegexOptions.IgnoreCase | RegexOptions.Singleline); 

foreach (Match match in regex.Matches(html))
{

}

но он находит только первый матч. Он не находит второго. Разве я не могу понять, почему?

  • 0
    Попробуйте свои регулярные выражения здесь: debuggex.com Мне кажется, у вас есть поддельные ? незадолго до <text>
  • 0
    regex101.com говорит, что ваше регулярное выражение отлично подходит к обоим примерам (после удаления новых строк из входных данных). В то время как RegexOptions.Singleline должен исправить любые проблемы с RegexOptions.Singleline , не могли бы вы удалить все новые строки из вашего второго примера и проверить, соответствует ли ваш код впоследствии?
Показать ещё 1 комментарий
Теги:

1 ответ

0
Лучший ответ

Регулярное выражение слишком жадно в 6-й группе, (. *)\<\/Script \> *. Я добавил ленивое поведение ко всем (.*) Группам, и вот фиксированное регулярное выражение:

(?s)\<script(.*?)type=(.*?)text/javascript(.*?)\>(.*?)\/\/\<\!\[CDATA\[(?<text>(.*?))\/\/\]\]\>(.*?)\<\/script\>

Итак, если вы запустите регулярное выражение на своих конкатенированных входах, вы получите 2 совпадения, и ваш CDATA будет в .Groups[5].Value.

  • 0
    Brilliant. Это работает отлично. Спасибо!
  • 0
    Одна проблема, которая у меня сейчас возникла, заключается в том, что она соответствует целому тексту от начала самого первого тега сценария до конца этого выражения. то есть это HTML-страница, и в моих примерах совпадение начинается не с тега script. Он начинается с самого первого тега скрипта в документе.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню