「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:3754
現在:4


検索と置換パネルでの正規表現で、改行文字の扱い

ページOpenOffice.org FAQの登録ページ
投稿者ny
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2007-04-08 08:00:26 (日)
OSWin2k
依存するページfaq/4/413
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

通常Perl等でやるように、<[^>]*>\n で「改行文字+その直前の文字(タグ)」にマッチさせたい場合、Writerの正規表現では、どうしたらよいのでしょうか?もしできるようでしたらお教え下さい。(エディタでやればよいので緊急ではありませんが、Writer上で可能なら有り難いです)

操作したいテキストは、シフトJIS/CRLF の htmlファイルをいったんエディタで開き、そのエディタから Writerにコピペしたものです。 htmlタグはありますが(つまりテキスト内容は html文書ですが)、ファイル自体は htmlファイルとして保存しておらず odtファイルとして保存しています。 ちなみになんでそんなことしてるのかというと、書式が欲しいからなのです。 (すいません、なんかややこしくてとても読みにくいかも・・・)

「改行のみのいわゆる空行」は、^$ でマッチし、置換テキスト欄を"空"にして置換すると、削除してくれます。 「シンプルなhtmlタグ」は <[^>]*> でマッチし、同様、"空"置換で削除できます。 「行末にあるhtmlタグ」は <[^>]*>$ でマッチしてくれます。これを"空"置換すると、その行の行末にあるタグのみを削除してくれます。

ですが、 「行末にあるhtmlタグ+その直後の改行文字」の <[^>]*>\n だとマッチしてくれません。

検索と置換パネルでのヘルプから「正規表現のリスト」を見ると \n は、"(Shift) + (Enter) キーで挿入された手動の改行を表します。" との記述があり、なんとなく \n ではマッチしないようです。 実際たしかに \n のみでもマッチできません。 悩んで、Wordの ワイルドカード ^13 もやってみましたが駄目でした。 そして試しに駄目もとで $ のみでやってみましたところ、びっくりなのですが、どうやらこれで「改行文字」にマッチしてくれてしまいます。"空"置換(削除)もできます。

だとすると、<[^>]*>$ で、「行末にあるhtmlタグ+その直後の改行文字」にマッチしてくれるように思えてしまうのですが、やはり「行末にあるhtmlタグ"のみ"」にしかマッチしてくれません。

つまり現状 Writerの正規表現では、いわゆる通常の「改行文字のみ」にマッチさせようとする場合は、$ のみでできます、 でも、「改行文字+その直前の文字」となると $ は「改行文字」部としてはマッチしてくれません。 多分、 $ のみで「改行文字」自体にマッチしてしまうことがじつは変で、

[^>]*>$ が「(改行文字を含まない)行末にあるhtmlタグ(のみ)」にマッチすることは正しい気がします。(経験上)


Writerでの改行の扱い

M.Kamataki (2007-04-08 17:01:06 (日))

質問内容は「行末のHTMLタグと改行を削除して1行詰めたい」と解釈できますか。であれば、“「<[^>]*>$」で指定した検索文字を"空"置換して[Backspace]を押す”という動作のマクロということが考えられます。

で、その前にご質問の中で言及しているように、Writerでは改行(\n)は"(Shift) + (Enter) キーで挿入された手動の改行" であり、一般的な改行とは異なる概念になります。下図を見てください。

faq4_412_01.png

「\n」は、わざわざ挿入したWriterの改行にしかマッチしません。一般的な改行と同じものは、図で「P」を左右反転させたような記号になります。

正規表現でこの記号にマッチさせるためには、「Wordの ワイルドカード ^13」のような指定の仕方になるはずですので、Writerではどういう表現になるか検索中です。しかし、なかなか見つからないですね。

Writerの置換機能を拡張させたマクロ

M.Kamataki (2007-04-08 18:01:33 (日))

「remove all manual breaks」
http://www.oooforum.org/forum/viewtopic.phtml?t=22034&view=previous

で紹介されているIannzFindReplace.sxw のマクロで実現できそうです。使い方は以下のような感じです。なお、マクロを汎用的に動かすために、何らかの方法でファイル付属のものから「マイマクロ」に登録する必要があります。これに関しては、後ほど別質問にしてエクステンションを使う方法を紹介します。(faq/4/413「エクステンションはどうやって作成するのですか」)

  1. [ツール]−[マクロ]−[マクロを実行]を選択
  2. 「マクロの選択」ダイアログで「ライブラリ」欄で[マイマクロ]−[IannzFindReplace]−[modIannzFindReplace]を選択
  3. 「マクロ名」欄で「IsnnzFindReplace」を選択して[実行]をクリック
    faq4_412_02.png

  4. 「Find」欄に「<[^>]*>$」、「Replace」欄に「\c」を入力(正規表現はダイアログ右側のプルダウンメニューで選択可能)して[Find]ボタンで該当する文字列に移動
    faq4_412_03.png

  5. [Replace]ボタンをクリックして置換
    faq4_412_04.png

Re: Writerでの改行の扱い

Tora (2007-04-09 10:39:43 (月))

お答えではないのですが、こんな背景があります。という情報です。

M.Kamataki が指摘されているように、Writerにおいては、通常のリターンキー(Enterキー)や外部からテキストとしてコピーしてWriterに貼り付けた改行は、「段落の区切り」として処理されています。

複数の「段落」は前後の段落がつながってる1つの文字列ではなく、Calcにおける隣接する「セル」のようなものと考えてみるといいかもしれません。えっと、つまり、「段落を区切る」文字というものが実在していないのではないかと思います。もしかしたら間違っていることを言っているかもしれませんので、鵜呑みにはしないでくださいませ。

少し無茶な例としては、以下のようなHTMLを想像してみるといいかもしれません。

<p>一つ目の段落の内容</p>
<p></p> <!-- 空行 -->
<p>三つの段落の内容
その中に改行文字もはいる
その続き</p>


というわけで、二つの段落をまたぐような正規表現を記述しようとなると、特定の文字でマッチさせるのではなく、なんらしかのWriter内部における工夫による特別な意味を持つ文字を使わないと実現できないような気がいたします。

Writerでは、少なくとも以下の四つの「区切り」を扱っています。
・ページを区切る (Ctrl+Enterキー)
・段落を区切る (Enterキー)
・段組のときの段を区切る (挿入/任意区切り の 「段 区切り」)
・段落内で行を区切る (Shift+Enterキー)

これらの区切りをうまく既存の正規表現で表現しようとすると、なんとなくややこしそうですね。

IannzFindReplaceマクロ and ...

ny (2007-04-09 19:40:46 (月))

M.Kamatakiさま

ご紹介ありがとうございました。(& faq/4/413
IannzFindReplace.zip解凍後の IannzFindReplace.sxw ファイルはまだ見ていないのですが、エクステンションファイル(IannzFindReplace.oxt)のほうは、

ツール(T) -> 拡張機能マネージャー(E)の「追加(A)」で
すんなりインポートできました。

エクステンションファイル(.oxt)を OS側が認識していないので、faq/4/413 のように
ダブルクリック・インストールは無理でしたが、上記手動追加でオッケーのようでした。

一応メニュー部だけ日本語にしてみましたが、挙動がなかなか怪しい感じです・・・
この件での <[^>]*>$ は動作するようなのですが、置換操作後、続けて別の置換をしようとすると動かなかったりしてます。Writer再起動でできたりするので、原因よくわかりませんが、元々が怪しいのか、日本語にしたから怪しいのか検証はできていません。
あと、マクロ記述は Basic?でしょうか? 私はBasicの経験なく、プログラム処理の内容を読めてないのですが、一つ、

「書式スタイルを追加:」部分の ListBoxStyleFamilyリストボックス内の文字列、
"Character"と"Paragraph"は、プログラム内部で使っているようで、ただ変更しても動作しませんでした。なのでこの部分は英語のままにしてあります。


Toraさま

なかなか難しそうなので、一応 Writerに正規表現があるだけマシと考えるようにします。
Officeソフトで正規表現が一応できるだけでも有り難いですし、駄目なら慣れてるエディタにもっていって、また戻せばよい話でもありますので。

使い方がよくわからなくて申し訳ありません。

ny (2007-04-09 19:46:41 (月))

Iannz_menu_ja.png、
IannzFindReplace_ja.oxt
添付してみたのですが・・・すみません。

Iannz_menu_ja.png

Re: 使い方がよくわからなくて申し訳ありません。

M.Kamataki (2007-04-09 22:45:39 (月))

これはがらりとダイアログが変わりましたね。けっこうすごい。

日本語化されたものを試してみましたが、
>置換操作後、続けて別の置換をしようとすると動かなかったりしてます
たとえば、どんな操作でしょうか。「<[^>]*>$」を1個1個ずつ、「検索」して「置換」といった操作なら連続でもOKですね。ま、マクロの操作については、本質問の流れとは離れるので、作者さんとコンタクトが取れるところでやられるのが良いと思います。 :)

Re2: 使い方がよくわからなくて申し訳ありません。

ny (2007-04-10 14:39:29 (火))

M.Kamatakiさま

pngを見えるようにしていただいてありがとうございました。

>>置換操作後、続けて別の置換をしようとすると動かなかったりしてます
>たとえば、どんな操作でしょうか。

すいません。こちら大丈夫かもしれません。
裏でマクロ編集(日本語化)しつつだったから?かもしれませんが、
「<[^>]*>$」ですべて置換、
直後、
「$」を消して、
「<[^>]*>」ですべて置換するとエラーが出て、できなかったのですが、今日はできます。

やっぱり OpenOffice本体(Writer)の検索置換のほうが、マクロよりも何かと使い勝手がよいので、できればマクロ要らずになってくれたらよいのですが・・・

ただ、本体側とIannzが同じ挙動になったら、
現状の、
本体側で、「<[^>]*>$」は、「行末にあるhtmlタグ」にマッチ。
Iannz側で、「<[^>]*>$」は、「行末にあるhtmlタグ+その直後の改行文字」にマッチ。
のどちらかができなくなることにもなるので、それもなかなか困ったことになりそうですね。

ひとまずこちらのページ、優先順位を「低」に変更して、状態「保留」にしました。
ありがとうございました。

ちょっと誤解があるかも

M.Kamataki (2007-04-11 01:04:35 (水))

と思いました。

>Iannz側で、「<[^>]*>$」は、「行末にあるhtmlタグ+その直後の改行文字」にマッチ。
検索時は標準と同じだと思います。マクロのBasicをすべて理解しているわけではありませんが、置換時にColumn Breakに変換すると、「検索文字列前後のColumn Breakが削除後はひとつになった」みたいな動作になっているのではないでしょうか。

re ちょっと誤解があるかも

ny (2007-04-11 17:43:26 (水))

re ちょっと誤解があるかも

あれ?すいませんー
検索時点でマッチの仕方が違っているように思ったのですが、違うんでしょうか?
私はマクロのBasicはほとんど読めていないので、多分もっとわかっていないはずです(笑)
もしかして、環境によって挙動が違うようでしたらまたお知らせいただければ有り難いです。
以下、添付します。

標準での検索画面(<[^>]*>$ マッチ時)

reg-ex_test1_normal.png


Iannzでの検索画面(<[^>]*>$ マッチ時)

reg-ex_test2_iannz.png

すみません

M.Kamataki (2007-04-12 09:42:33 (木))

わたしの確認不足でした。置換テキストに「\c」を指定しないと置換できないと思っていましたが、置換テキストが空でも置換できますね。

ということで検索側の正規表現も拡張されてました。逆にいえば、IannさんのようにBasicで拡張しないと、改段落は削除できないということですね。

お名前:
題名:


添付ファイル: filereg-ex_test2_iannz.png 1002件 [詳細] filereg-ex_test1_normal.png 1004件 [詳細] fileIannzFindReplace_ja.oxt 654件 [詳細] fileIannz_menu_ja.png 577件 [詳細] filefaq4_412_04.png 559件 [詳細] filefaq4_412_03.png 561件 [詳細] filefaq4_412_02.png 556件 [詳細] filefaq4_412_01.png 589件 [詳細]