Вопрос
Как сопоставить три слова в следующей строке с регулярным выражением, совместимым с Perl?
слово1#$слово2#$слово3
Я заранее не знаю настоящих слов «слово1, слово2 и слово3».Я знаю только разделитель #$.
И я не могу использовать границу слова, поскольку у меня многобайтовая кодировка.Это означает, например, что строка может содержать символы, отличные от ASCII, такие как умлауты, которые не обнаруживаются управляющим символом \w.
Решение
Попробуйте это регулярное выражение:
/(\w+)#\$(\w+)#\$(\w+)/
РедактироватьПосле того, как вы предоставили нам дополнительную информацию (см. комментарии к этому ответу):
/((?:[^#]+|#[^$])*)#\$((?:[^#]+|#[^$])*)#\$((?:[^#]+|#[^$])*)/
Другие советы
#!/usr/bin/perl
use strict;
use warnings;
my $x = 'word1#$word2#$word3';
print $_, "\n" for split /#\$/, $x;
$str = explode('#$', $str);
Regex для этого излишен.
Функция разделения может оказаться полезной, хотя это зависит от того, что вы хотите сделать с линией.
хотя вот пример.
my $line = "word1#$word2#$word3"
my @words = split('#$', $line)
Это будет работать для любой строки, имеющей 2 #
/([^#]+)\#\$([^#]+)\#\$([^#]+)/
/([^#]*?)#\$([^#]*?)#\$([^#]*)/