我有一个句子需要在某些修改后替换。
但是,该句子不会在我的原始文件中替换,因为它包含圆括号。我如何确保它被替换,因为圆括号的存在在句子中并不总是必要的。
例如。$table=~s/<table-wrap-foot>($foot1)<\/table-wrap-foot>/$foot/sg;
在这里,$foot 可能有也可能没有圆括号。我什至尝试过使用\Q$foot\E
,但它无法正常工作。!
任何帮助,将不胜感激
我有一个句子需要在某些修改后替换。
但是,该句子不会在我的原始文件中替换,因为它包含圆括号。我如何确保它被替换,因为圆括号的存在在句子中并不总是必要的。
例如。$table=~s/<table-wrap-foot>($foot1)<\/table-wrap-foot>/$foot/sg;
在这里,$foot 可能有也可能没有圆括号。我什至尝试过使用\Q$foot\E
,但它无法正常工作。!
任何帮助,将不胜感激
尝试通过正则表达式对任意输入执行此操作将导致疯狂。使用XML::Twig:
#!/usr/bin/env perl
use 5.012;
use strict;
use warnings;
use XML::Twig;
my $xml = <<EO_XML;
<table-wrap-foot>
translocations or inversions: t(8;21), inv(16) or
t(16;16), t(15;17), t(9;11), t(v;11)(v;q23),
t(6;9), inv(3) or t(3;3)
</table-wrap-foot>
EO_XML
my $t = XML::Twig->new;
$t->parse($xml);
say $t->root->first_child_text;
如果您想在搜索值中包含括号,则需要转义转义括号的反斜杠。替换中的括号不会成为问题,但它会在匹配中,因为它们用于在正则表达式中进行分组。
假设您有一个分配给$table
您的值,您只想传递您想要搜索和替换的文本。
以下示例将替换字符串中的(hello)
with :hi
<table-wrap-foot>(hello)</table-wrap-foot>
#!/usr/bin/perl
$foot = "(hello)";
print $foot . "\n"; # $foot = (hello)
# replace all ( and ) with \( and \)
$foot =~ s/(\(|\))/\\$1/sg; # $foot = \(hello\)
print $foot . "\n";
# replace with "hi"
$table = "<table-wrap-foot>(hello)</table-wrap-foot>";
print $table . "\n";
$table =~ s/<table-wrap-foot>($foot)</table-wrap-foot>/hi/sg;
print $table;
输出:
> perl test.pl
(hello)
\(hello\)
<table-wrap-foot>(hello)</table-wrap-foot>
hi
在正则表达式中,(
和)
是特殊字符(用于分组)。要从字面上匹配它们,请像\(
and一样将它们转义\)
。
要选择匹配某些内容,请使用?
量词。
所以你的正则表达式变成:
$table=~s/<table-wrap-foot>\(?$foot1\)?<\/table-wrap-foot>/$foot/sg;
或使用扩展语法,以提高可读性:
$table =~ s{
<table-wrap-foot> # beginning marker
\(? # optional opening paren
$foot1 # the original sentence
\)? # optional clonsing paren
</table-wrap-foot> # closing marker
}{$foot}xsg;
请注意,x
正则表达式末尾的 表示您可以在表达式中使用注释,并且忽略普通空格(使用\s
或[ ]
匹配它)。此外,如果您s{}{}
用作分隔符,则不再需要转义/
结束标记中的 。
perldoc perlop中的更多内容:Regexp Quote-Like Operators 。
找不到出路..所以做了一个技巧..在开始操作文件之前将括号替换为自制实体,然后在将结果打印回文件之前将其替换为相同的实体...
尝试这个:
$table=~s/<table-wrap-foot>[\(]*$foot1[\)]*<\/table-wrap-foot>/$foot/sg;
这样,您将括号视为普通字符,并要求它们的 0 或 1 个巧合。