Переменная интерполяция в подстановках регулярных выражений - PullRequest
0 голосов
/ 19 сентября 2018

Я работаю над программами на Perl, чтобы анализировать XML и выполнять регулярные замены строк в данных.Я прочитал пару статей о подстановке строк с использованием Perl.

При замене исходного значения целевой строкой они используют некоторые $ переменные ($1, $2, $3 и $4 так далее.).Как шаблон хранит значения при сравнении строк?

Пожалуйста, найдите пример кода, который я ищу.

Пример XML-файла

  <Para>
    <Hyperlink Display="hide" Protocol="http" URN="https://www.basicurl.org/oid/10.1161/RIA.0000abc">
      AHA
    </Hyperlink>
    (Free)
  </Para>
  <Para>
    <Hyperlink Display="hide" Protocol="http" URN="https://www.abcd.com">
      Background: some text with multiple lines
    </Hyperlink>
    (i have three lines of code)
  </Para>
</Comment>

Целевое достижение

$Str =~ s|<Hyperlink\b[^\>]*?>([^\xFF]*?)([12][890][0-9]{2})([^\xFF]*?)</Hyperlink>|<Emph Emph.Type="Italic">$1</Emph>$2$3|g;

Насколько я понимаю, мы выбираем данные гиперссылки и заменяем значение в $str./g представляет глобальную замену.Каковы значения $1, $2 и $3 из указанного выше входного файла?

1 Ответ

0 голосов
/ 20 сентября 2018

Когда вы используете шаблон регулярных выражений, есть нечто, называемое захват групп , которые в шаблоне ограничиваются скобками (...).Они нумеруются в том порядке, в котором их открывающие скобки появляются в шаблоне, и используются для сохранения частей строки во встроенных переменных Perl $1, $2 и т. Д.

Например, * 1008.* захватывает hello или hell в $1 и good или god в $2


О вашем примере

$Str =~ s|<Hyperlink\b[^\>]*?>([^\xFF]*?)([12][890][0-9]{2})([^\xFF]*?)</Hyperlink>|<Emph Emph.Type="Italic">$1</Emph>$2$3|g;
  • ([^\xFF]*?) будет захватывать любой символ, не равный FF (шестнадцатеричный) от 0 до бесконечного количества раз.Он может содержать 0 или более символов, не равных "\xFF"

  • ([12][890][0-9]{2}), будет захватывать цифру 1 или 2, за которой следует цифра 8 9или 0, за которыми следуют две цифры от 0 до 9.

  • ([^\xFF]*?) совпадает с первой группой захвата

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...