0

我有一个句子需要在某些修改后替换。

但是,该句子不会在我的原始文件中替换,因为它包含圆括号。我如何确保它被替换,因为圆括号的存在在句子中并不总是必要的。

例如。$table=~s/<table-wrap-foot>($foot1)<\/table-wrap-foot>/$foot/sg; 在这里,$foot 可能有也可能没有圆括号。我什至尝试过使用\Q$foot\E,但它无法正常工作。!

任何帮助,将不胜感激

4

5 回答 5

2

尝试通过正则表达式对任意输入执行此操作将导致疯狂。使用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;
于 2013-04-01T13:14:41.803 回答
1

如果您想在搜索值中包含括号,则需要转义转义括号的反斜杠。替换中的括号不会成为问题,但它会在匹配中,因为它们用于在正则表达式中进行分组。

假设您有一个分配给$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
于 2013-04-01T06:02:34.350 回答
1

在正则表达式中,()是特殊字符(用于分组)。要从字面上匹配它们,请像\(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 。

于 2013-04-01T06:02:16.350 回答
0

找不到出路..所以做了一个技巧..在开始操作文件之前将括号替换为自制实体,然后在将结果打印回文件之前将其替换为相同的实体...

于 2013-04-02T11:19:35.023 回答
0

尝试这个:

$table=~s/<table-wrap-foot>[\(]*$foot1[\)]*<\/table-wrap-foot>/$foot/sg;

这样,您将括号视为普通字符,并要求它们的 0 或 1 个巧合。

于 2013-04-01T05:54:44.467 回答