0

私は現在、単純な作業だと思っていた問題に直面しています。

次のような文字列がある場合:

文 1 「二重引用符」 文 1. 文 2 ? 文 3 (1.2 のような括弧内の数字は分割しないでください)。文 4 ' 一重引用符で囲まれた句。残りの引用文 4. 文 5!

私はそれを分割したい:

文 1 「二重引用符で囲まれた句」 文 1.

文2?

文 3 (1.2 のような括弧内の数字は分割しないでください)。

文 4 ' 一重引用符で囲まれた句。残りの引用文 4.

文5!

明らかに、単純な"\.|\?|!"一致は機能しません。どんな助けでも大歓迎です。

正規表現がこれに最適なツールではないかもしれないことは理解していますが、私が見逃している別の簡単で簡単な解決策がない限り、私は引き返せないところを過ぎています。

4

2 に答える 2

1

それが正規表現の仕事かどうかはわかりません。

しかし、この正規表現を見てください(sed付き):

 sed -r 's/([.?!]) +([A-Z])|\1$/\1\n\2/g' file

出力:

Sentence 1 “double quoted phrase” sentence 1.
Sentence 2?
Sentence 3 (numbers in parentheses like 1.2 should not be split).
Sentence 4 ' single quoted phrase. rest of quote' sentence 4.
Sentence 5!

しかし、それは完璧ではありません。rest文4を変更するRestと失敗します。

問題は、それ.!?によってラップされた"",'',(),[],{}....ものが文の終わりではないかどうかを確認する必要があるということです。ただし、最悪の部分は、たとえば、次のような文を書くことです。

The dot ". is a period.

締めくくりの引用を忘れた(間違い)ことに注意してください。または次の(2文):

Why not put a brace "(" there ? The closing brace ")" is missing its partner.

あなたのプログラム(正規表現による)は、これが2つの文であるべきだとどうやって知ることができますか?

于 2013-03-09T21:33:56.637 に答える
1

次の正規表現を試してください

(?:^|\s).+?[.!?](?:\s|$)
于 2013-03-09T21:22:27.593 に答える