Perl貪欲な正規表現の一致は予想よりも優れています。

Perl貪欲な正規表現の一致は予想よりも優れています。

いくつかの出力を削除する必要がある次のテキストがありますwdiff

text='Иса Мәсіхтің елшісі Петірден [-(-] осы күнәкар дүниеде [-)-] жат жерлік болып, Понти, Ғалатия, [-Қападоқия, Азия және Бітүния аймақтарында шашыраған [ сенушілерге дұғай сәлем ].-] {+Қападоқия… https://t.co/.......... [Петірдің 1 1:1-5]+}'

[- -]貪欲ではないPerl正規表現を使用してテキストブロックを削除しようとしていますが、\[-.*?-\]前のブロックとも一致します。

$ perl -pe 's|\[-.*?-\] {\+(\S+… https://t.co/.*)\+}|\1|' <<<"$text"
Иса Мәсіхтің елшісі Петірден Қападоқия… https://t.co/.......... [Петірдің 1 1:1-5]

予想出力:

$ perl -pe 's|\[-.*?-\] {\+(\S+… https://t.co/.*)\+}|\1|' <<<"$text"
Иса Мәсіхтің елшісі Петірден [-(-] осы күнәкар дүниеде [-)-] жат жерлік болып, Понти, Ғалатия, Қападоқия… https://t.co/.......... [Петірдің 1 1:1-5]

ベストアンサー1

入力文字列を次に単純化しましたqABxBCzABxBCDEFw。ここで

A represents [
B represents -
C represents ]
D represents {\+
E represents the text between the +s (including the URL)
F represents \+}
Lower case letters represent everything else.

したがって、入力に対して実行するいくつかの代替コマンドは次のとおりです。

                                  Command                          Output
0. Input text:                                                     qABxBCzABxBCDEFw
1. Non-greedy:                   's|AB.*?BCD(E)F|\1|'              qEw
2. Greedy:                       's|AB.*BCD(E)F|\1|'               qEw
3. Restricted Non-greedy:        's|AB[^B]*?BCD(E)F|\1|'           qABxBCzEw
4. Restricted Greedy:            's|AB[^B]*BCD(E)F|\1|'            qABxBCzEw
5. Constrained Non-greedy:       's|(.*)AB.*?BCD(E)F|\1\2|'        qABxBCzEw
6. Constrained Greedy:           's|(.*)AB.*BCD(E)F|\1\2|'         qABxBCzEw

コマンド1は試したコマンドです。コマンド2は同じですが、欲がないわけではありません。ご存知のように、彼らは同じ結果をもたらします。

貪欲ではないのは、次にのみ適用されるようです。長ささんのテキストが同様のものと一致しています.*。  始点には影響しません。  正規表現の一致は常にできるだけ早く開始されます。したがってAB.*?BC(つまり、)と言うと\[-.*?-\]一致します。最初 [-オンライン。その後、任意の文字で終わる可能な限り短い文字列と一致すると予想します-]。あなたはこれが本当であると予想するかもしれません[-(-]。しかし、もう少し詳しく見てください。正規表現は、AB.*?BCD(E)Fすべての文字で終わる可能な限り短い文字列と一致する必要があります-] {+。これにより、URLまでほぼすべてを消費することになります。

私はあなたが望むことを実行しているように見える4つの代替コマンドを書きました。 「制限された」もの(3と4)はnotを検索しますAB.*BCが、AB[^B]*BC文字通りAB…「...」にはsがありませんBCBあなたの場合、これは... [-"..."に-]sがないことを意味します。 「制限された」項目(5および6)は、-貪欲なプレイヤーを前に配置して、AB.*BCゲームをできるだけ遅く始めるように強制します。この分野では、欲が多いかどうかは.*関係ありません。AB.*BC

おすすめ記事