2013-05-22 5 views
5

正規表現を使用してピリオドで区切られていない改行のみを選択できますか? 私は学生用の字幕ファイルを編集しています。印刷版のデッドツリーを使いやすいようにするには、ピリオドや疑問符の前にスペースがないすべての改行を置き換えようとしています。ピリオドの前にないすべての改行を正規表現に置き換えますか?

オプション1
すべてのラインがそのために動作しますが、それはもちろん、改行の前に単語の最後の文字を選択[a-z]\n期間または疑問符正規表現が先行していない休憩を選択します。 - >どういうわけか、改行の前に単語の最後の文字を保存して挿入して、スペースで正規表現を使用して挿入するか、それともスクリプトを書く必要がありますか(例えば、php)

オプション2
文字で始まる改行のみを選択します。私はlookbehindを見てみました。

この質問を書いソリューションは、私を襲っている間。 文字より前の改行を選択するには(?<=[a-z])\nを入力し、スペースで置き換えます。

私は、スタックオーバーフローを検索し、本当に私が探していたものを見つけることができませんでした。私は質問と解決策を同時に投稿することで誰もが怒らないことを願っています。将来他の人に役立つかもしれません。

+7

あなたは、あなた自身の質問への答えを持っている場合は、あなた自身の質問に答える – Blender

+2

ポストとそれを受け入れることができます。これは、あなたがSO上で行うと予想される標準的なことです。 – Patashu

+0

私は@Blenderに同意します。あなたは正しい作品を持っています。 '' .''は ''任意の文字 ''を意味し、 '' \ .''は ''ピリオド ''を意味し、 '' \ R''は '' \ n''よりいくらか安全です。 – mzedeler

答えて

0

構文は、テキストを置き換えるために使用する内容(Java、Perl、PHP、sed、viなど)によって異なる場合があります。 Perlで

str.replaceAll("([^\\.!?])\r?\n", "$1 ").replaceAll(" +", " "); 

:あなたはこの試みることができるJavaでは

perl -p -e 's/([^\.!?])\n/\1 /g; s/ +/ /g;' file.txt 

をあなたにも同様の質問にこの答えを読むことができます:

How can I replace a newline (\n) using sed?

+0

phpを使用してこれの例を表示できますか? – user1017063

+0

@wim hendrixこれはオプション1です。 @Eric Citaire文字クラスの中で '.'をエスケープする必要はありません。また、Perlでの公式の勧告は、置換文字列に '\ 1 'ではなく' $ 1'を使用することになっていたと思います。 http://perldoc.perl.org/perlre.html#Quoting-metacharactersに例がありますが、私はあなたが '\ 1'を使うべきではないことを発見したわけではありません。 (ただし、正規表現自体では '\ 1'を使用します) –

0

のは、定義しよう最初に改行します。いくつかの正規表現の味では、Java 8/PHP(PCRE)、Ruby(Onigmo)では、任意の改行スタイルに一致する略語クラス\Rを使用することができます。以下のようにJava 8 regex reference, \R is defined

\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029] 

今、あなたはそれが.文字で始まるされていない場合は、このパターンを見つけたいです。 負の検索ビヘイビア(?<!\.)を使用する必要があります。現在の場所のすぐ左にある.が見つかると、それは失敗します。

  • PHP(demo):preg_replace('~(\.\R+)|\R+~', '$1', $s)
  • のJava 7(demo):String rx_R = "(?:\\u000D\\u000A|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029])"; String res = s.replaceAll("(\\." + rx_R + ")|" + rx_R, "$1");
  • ルビーdemo(だから、ここでいくつかの言語でドットを先行しない改行を削除する方法の例をいくつか示します):s.gsub(/(\.\R+)|\R+/, '\1')
  • C#(demoを参照):var rx_R = @"(?:\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])"; var res = Regex.Replace(txt, [email protected]"(\.{rx_R})|{rx_R}", "$1");
  • パイソン(2.xおよび3.xの両方)(demo):rx_R = r'(?:\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])'その後、re.sub(r'(\.{0})|{0}'.format(rx_R), lambda x: x.group(1) if x.group(1) else '', s)
  • JavaScriptを:それは、このように、改行の前に.以外の文字を維持するために([^.]|^)キャプチャグループと(置換文字列からそれを参照する$1)後方参照を使用して、後読みをサポートしていません:

var s = "Line1\u000D\u000A Line2\u000B Line3\u000C Line4\u0085 Line5\u2028 Line6\u2029 Line7"; 
 
var rx = /([^.]|^)(?:\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])/g; 
 
console.log(s.replace(rx, '$1'));

+0

EOLが\ r \ nのテキストをテストします。 PHPでは 'preg_replace( '〜(?<!¥。)¥R〜'、 ''、$ s)'(**。EOL **を空白に置き換えます)を使用します。 ** \ EOL **の後に\ Rは空白のままになります。しかし、私がregexpの文字列で_ \ r \ nに変更すると、空白は消えてしまいます。どうして? –

+0

@ScottChuバックトラックと '\ R'は固定幅のパターンではありません("展開された "' \ R'文字クラスのパターンを見ることで見ることができます。文字)。 '\ r'が見つかるとすぐに' .'が検索されます。 '.'があるので、' \ r'は失敗し、エンジンは '\ n'をテストするために実行され、' \ r'( '.'ではなく)が前に置かれているので、' \ n'スペースに置き換えられます。 PHPでは 'preg_replace( '〜(\。\ R +)| \ R +〜'、 '$ 1'、$ s)'を使用する必要があります。[** this demo **](https://ideone.com/e7Ms5x )。 –

+0

@ScottChuご連絡ありがとうございます、私は答えを改善することができます。 –

関連する問題