Perl Regrex, который захватывает подстроку между метками - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь найти решение в Perl, которое фиксирует имя файла в следующей строке - между метками.

my $str = "Saving to: ‘wapenc?T=mavodi-7-13b-2b-3-96-1e3431a’";

(my $results) = $str =~ /‘(.*?[^\\])‘/;
print $results if $results;

Мне нужно в конечном итоге получить wapenc? T = mavodi-7-13b-2b-3-96-1e3431a

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Ваши тиковые символы не входят в 7-битный набор символов ASCII, поэтому здесь есть целая кроличья нора для кодировки символов.Но быстрое и грязное решение состоит в том, чтобы захватить все, что находится между расширенными символами.

($result) = $str =~ /[^\0-\x7f]+(.*?)[^\0-\x7f]/;

[^\0-\x7f] соответствует символам со значениями символов не от 0 до 127, т. Е. Всем, что не является 7-битным символом ASCIIвключая новые строки, вкладки и другие последовательности управления.Это регулярное выражение будет работать независимо от того, является ли ваш вход кодированным в UTF-8 или уже декодировано, и может работать и для других кодировок символов.

0 голосов
/ 22 декабря 2018

Последний тик, кажется, отличается в вашем регулярном выражении от входной строки - char 8217 (ОДНОРАЗОВАЯ МАРКА ЦИТАТЫ U + 2019) и 8216 (ОДНОМ ОДНОМ МАРКЕ U + 2018).Кроме того, при использовании символов Unicode в исходном коде обязательно включайте

use utf8;

и сохраняйте файл в кодировке UTF-8.

После исправления этих двух проблем код работал для меня:

#! /usr/bin/perl
use warnings;
use strict;
use utf8;

my $str = "Saving to: ‘wapenc?T=mavodi-7-13b-2b-3-96-1e3431a’";

(my $results) = $str =~ /‘(.*?[^\\])’/;
print $results if $results;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...