2015-12-16 2 views
1

У меня есть большая строка (длина 1116902 символов), которую я хочу обработать с помощью регулярного выражения (довольно простой). Я получаю ответ от мыльного сервера, который закодирован в base64. Поэтому я просто получаю результат между соответствующими тегами xml и затем декодирую ответ.Есть ли ограничение длины при использовании метода замены строки?

Это работает для небольшого запроса. Но когда я получаю большой ответ назад, функция обратного вызова метода replace() никогда не вызывается. Я попытался проверить строку на веб-сайте regex101 и найти результат. Поэтому я задаюсь вопросом, есть ли ограничение в моем движке JavaScript. Я работаю над Wakanda Server V10, которые используют Webkit в качестве механизма JavaScript. Я не могу предоставить строку, потому что она содержит некоторую корпоративную информацию.

Вот мое регулярное выражение: /xsd:base64Binary">((.|\n)*?)<\/responseData>/

я учил это может быть специальный символ, который не входит в ((.|\n)*?) группу. Но тогда почему regex101 узнает результат (может быть, это движок JavaScript)

Может быть, кто-нибудь может мне помочь?

Благодаря

+3

'(. | \ N) *' вызывает столько отскоков, что двигатель быстро перерастает в ** катастрофический обратный отсчет **. С '(. | \ N) *?' Может возникнуть ошибка с большими строками, где конечный разделитель не может быть найден или слишком далеко от начального разделителя (аналогичная проблема). При анализе XML или HTML используйте соответствующие соответствующие синтаксические анализаторы вместо регулярного выражения. –

+0

Итак, как мне это сделать? Если я использую ony '. *', Он не будет проходить через линии. Есть ли у вас какие-либо предложения, как поймать ответ base64 внутри моей структуры xml? – Ganbin

+1

Итак, это XML. Используйте XML-парсер, вот [пример разбора строки в дереве XML и получение значения атрибута] (http://stackoverflow.com/questions/32497417/how-to-make-regex-in-node-js- вернуться-на-первых синхронизма-группы/32499583 # 32499583). Просто измените его немного, чтобы получить значение элемента. Существуют и другие способы анализа XML, а также другие комментарии здесь. –

ответ

1

Если вы можете гарантировать, что нет метки между вашим начальным и конечным ограничителем, который звучит, как это может быть, вы могли бы просто изменить свой RE на

/xsd:base64Binary">([^<]*)<\/responseData>/ 

, который не должен 't требует отступлений и может работать для вас.

[^<] просто означает все, кроме знака <. Поскольку между открытыми и закрывающимися тегами вашего раздела не должно быть никаких тегов (по крайней мере, это то, что я понимаю), которые будут принимать все, пока вы не нажмете на свой закрывающий тег. Важно то, что двигатель RE может сразу сказать, соответствует ли что-то или нет, поэтому не требуется разветвление или обратное отслеживание.

+0

Большое спасибо. Я больше узнаю о регулярном выражении. Это было не так сложно, но я не думал, чтобы получить все, кроме того, что Я уверен, что никогда не получу. – Ganbin

 Смежные вопросы

  • Нет связанных вопросов^_^