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

正規表現では、()は特殊文字 (グループ化に使用) です。文字どおりに一致させるには、 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正規表現の末尾の は、式でコメントを使用できることを意味し、通常の空白は無視されることに注意してください (一致させるには\sor[ ]を使用します)。また、区切り記号として使用する場合、終了マーカーでs{}{}エスケープする必要はもうありません。/

詳しくはperldoc perlop : Regexp Quote-Like Operators を参照してください。

于 2013-04-01T06:02:16.350 に答える
1

検索値に括弧が必要な場合は、括弧をエスケープするバックスラッシュをエスケープする必要があります。置換の括弧は問題になりませんが、正規表現でのグループ化に使用されるため、一致します。

値が割り当てられていると仮定すると$table、検索して置換するテキストのみを渡したいとします。

次の例では、文字列を に(hello)置き換えます。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 に答える
0

これを試して:

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

そうすれば、括弧を普通の文字として扱い、それらの 0 または 1 つの一致を求めます。

于 2013-04-01T05:54:44.467 に答える
0

方法を見つけることができませんでした..トリックを行いました..ファイルの操作を開始する前に括弧を自作のエンティティに置き換え、後で結果をファイルに出力する前に同じものに置き換えました...

于 2013-04-02T11:19:35.023 に答える