いくつかの出力を削除する必要がある次のテキストがあります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がありませんBC
。B
あなたの場合、これは... [-
"..."に-]
sがないことを意味します。 「制限された」項目(5および6)は、-
貪欲なプレイヤーを前に配置して、AB.*BC
ゲームをできるだけ遅く始めるように強制します。この分野では、欲が多いかどうかは.*
関係ありません。AB.*BC
答え2
あなたは否定的な視線:
perl -pe 's|\[-((?!-\]).)*-\] {\+(\S+… https://t.co/.*)\+}|\2|' <<<$text
問題は、最初の[-
一致が発生したときです。その後、モデルの貪欲はいくら貪欲にもかかわらず、望ましい効果を得ることはできません。否定的な予測を使用すると、文字列を除くすべての項目を一致させることができ、その部分の前-]
の項目のみを一致させます{+...+}
。