Я согласен, что правильный инструмент для синтаксического анализа XML и , особенно HTML , является синтаксическим анализатором, а не механизмом регулярных выражений. Однако, как указывали другие, иногда использование регулярного выражения выполняется быстрее, проще и выполняется, если вы знаете формат данных.
Microsoft фактически имеет раздел Рекомендации по регулярным выражениям в .NET Framework и, в частности, говорит о . Рассмотрим [вход] источника входного сигнала .
Регулярные выражения имеют ограничения, но вы считали следующее?
.NET framework уникален, когда речь заходит о регулярных выражениях в том, что он поддерживает Определения балансировочной группы .
По этой причине я считаю, что вы можете анализировать XML с помощью регулярных выражений. Обратите внимание, однако, что он должен быть достоверным. XML ( браузеры очень прощают HTML и допускают плохой синтаксис XML внутри HTML ). Это возможно, так как «Определение балансировки группы» позволит механизму регулярных выражений действовать как КПК.
Цитата из статьи 1, процитированной выше:
.NET Regular Expression Двигатель
Как описано выше, правильно сбалансированные конструкции не могут быть описаны регулярным выражением. Тем не менее, механизм регулярного выражения .NET предоставляет несколько конструкций, которые позволяют распознавать сбалансированные конструкции.
(?
- выталкивает захваченный результат в стек захвата с помощью группы имен.) (?<-group>)
- отображает верхний захват с группой имен с захвата stack.(?(group)yes|no)
- соответствует дате, если существует группа с группой имен, в противном случае не соответствует какой-либо детали.Эти конструкции допускают регулярную .NET выражение для подражания ограниченному КПК, по существу позволяя простые версии операций стека: push, pop и empty. Простые операции в значительной степени эквивалентны приращению, уменьшению и сравнению с нулем соответственно. Это позволяет механизму регулярного выражения .NET распознавать подмножество контекстно-свободных языков, в частности тех, которые требуют простого счетчика. Это, в свою очередь, позволяет нетрадиционным регулярным выражениям .NET распознавать индивидуально правильно сбалансированные конструкции.
Рассмотрим следующее регулярное выражение:
(?=
) (?> | <[^>]*/> | (?
<(?!/)[^>]*[^/]>) | (?<-opentag>[^>]*[^/]>) | [^<>]* )* (?(opentag)(?!)) Использовать флаги :
- Singleline
- IgnorePatternWhitespace (необязательно, если вы сбрасываете регулярное выражение и удаляете все пробелы)
- IgnoreCase (необязательно)
Объяснение регулярного выражения (inline)
(?=
) # match start with
# atomic group / don't backtrack (faster) | # match xml / html comment <[^>]*/> | # self closing tag (?
<(?!/)[^>]*[^/]>) | # push opening xml tag (?<-opentag>[^>]*[^/]>) | # pop closing xml tag [^<>]* # something between tags )* # match as many xml tags as possible (?(opentag)(?!)) # ensure no 'opentag' groups are on stack Вы можете попробовать это на A Better .NET Regular Expression Tester .
Я использовал источник выборки:
- stuff...
- more stuff
still more
- Another >ul<, oh my!
- ...
Это нашло совпадение:
- stuff...
- more stuff
still more
- Another >ul<, oh my!
- ...
, хотя оно получилось так:
- stuff...
- more stuff
still more
- Another >ul<, oh my!
- ...
Наконец, Мне очень понравилась статья Джеффа Этвуда: Parsing Html Путь Ктулху . Забавно, он цитирует ответ на этот вопрос, который в настоящее время имеет более 4 кв голосов.
Правильный способ сделать это - создать динамический хост с add_host и поместить его в новую группу, а затем запустить новую игру, предназначенную для этой группы. Таким образом, если у вас есть другие ключи подключения, которые необходимо установить заранее (учетные данные / ключи / etc), вы можете установить их в пустой группе в инвентаре, а затем добавить хост к ней динамически. Например:
- hosts: localhost
gather_facts: no
vars_prompt:
- name: target_host
prompt: please enter the target host IP
private: no
tasks:
- add_host:
name: "{{ target_host }}"
groups: dynamically_created_hosts
- hosts: dynamically_created_hosts
tasks:
- debug: msg="do things on target host here"
Отказ от ответственности: Принятый ответ предлагает наилучшее решение проблемы.
Я узнал, что можно использовать недокументированный hack в настоящее время (кредит для Bruce P для указания на сообщение), который превращает значение параметра -i
/ --inventory
в специальный список хостов (ссылка ).
Команда:
ansible-playbook -i "192.168.1.21," playbook.yml
И, соответственно, playbook.yml
можно запустить против всех хостов (которые в приведенном выше примере будут равны одному хосту 192.168.1.21
):
- hosts: all
В списке может быть более одного IP-адреса -i "192.168.1.21,192.168.1.22"
]
Добавление ответа Мэтта для нескольких хостов.
пример ввода будет 192.0.2.10,192.0.2.11
- hosts: localhost
gather_facts: no
vars_prompt:
- name: target_host
prompt: please enter the target host IP
private: no
tasks:
- add_host:
name: "{{ item }}"
groups: dynamically_created_hosts
with_items: "{{ target_host.split(',') }}"
- hosts: dynamically_created_hosts
tasks:
- debug: msg="do things on target host here"
Вместо этого вы можете передать его с помощью extra-vars
.
Просто сделайте раздел hosts
переменной, например {{ hosts_prompt }}
, а затем передайте хост в командной строке например:
ansible-playbook -i inventory/environment playbook.yml --extra-vars "hosts_prompt=192.168.1.10"
Или, если вы используете местоположение файла инвентаря по умолчанию в /etc/ansible/hosts
, вы можете просто использовать:
ansible-playbook playbook.yml --extra-vars "hosts_prompt=192.168.1.10"
inventory/environment
является всего лишь примером (как и для playbook.yml
). Если вы не предоставили файл инвентаря с помощью -i
, то Ansible просто подберет файл инвентаризации по умолчанию /etc/ansible/hosts
, который обычно не требуется, даже если вы указываете хосты с помощью extra-vars
– ydaetskcoR
14 October 2015 в 15:36
extra-vars
, а не «вот точная строка, которую вы должны ввести». И инвентарь является i> необходимым аргументом, он по умолчанию по умолчанию /etc/ansible/hosts
, и если этот файл не существует, он будет терпеть неудачу.
– ydaetskcoR
15 October 2015 в 06:40