痔になりやすい生活習慣とは?

正規表現で、
【青空文庫形式などでルビを活かし、ルビ該当の漢字を削除する】方法があったら教えて下さい。


例えば
焼肉定食《やきにくていしょく》を食べている、最中《さいちゅう》です。

というテキストを

やきにくていしょくを食べている、さいちゅうです。

というテキストに変換したいです。



目的は
朗読ソフトで読み上げるテキストの作成です。


通常、
朗読ソフトで読み上げるテキストの作成では、
ルビの削除を使う方もいらっしゃるので
そちらの正規表現は調べてあります。



しかし、活かしたいはルビの方で

例えば以下のような文章

最中《もなか》を食べている、最中《さいちゅう》です。

といった文章があった場合、ルビ削除では
正しく読み上げができないです。


ルビを活かして

もなかを食べている、さいちゅうです。

に変換する正規表現があったら教えて下さい。


当方の利用環境は
テキスト編集としては秀丸エディタ
epub変換ソフトとしてはcalibre
読み上げソフトは詠太(一太郎)   を利用してます。


よろしくお願いします。

A 回答 (3件)

例えばですが、



「1個以上の漢字」があり、
次に、「《」があり、
次に、「1個以上のひらがな」があり、
次に、「》」があれば、
「1個以上のひらなか」の部分だけにする、

という秀丸エディタの置換における正規表現の例は、以下のようになります。


 検索 : [亜-黑]+《([ぁ-ん]+)》
 置換 : \1

(※「正規表現」にチェックを入れます。)


意味は以下の通りです。

「[亜-黑]+」=「1個以上の漢字」
「[ぁ-ん]+」=「1個以上のひらがな」
「\1」=「1つ目の、()で囲んだ部分」


ただ、実際の文書データで実行すると新たな問題が出てくる可能性もありますので、その場合は正規表現の解説サイト等を参考に修正なさってください。

また、対象テキストファイルの文字コードやエディタの仕様によっては、漢字を表す「亜-黑」や、ひらがなを表す「ぁ-ん」の部分を、別の表現に変更しないといけない可能性もあるかも知れません。上記の正規表現がうまくいかなければ、その辺りも修正なさってください。


■ 秀丸エディタの正規表現―秀丸エディタを使いこなす
http://www.shuiren.org/chuden/teach/hidemaru/sei …
    • good
    • 0
この回答へのお礼

助かりました

ありがとうございます。
こちらを参考にさせていただきます。

お礼日時:2017/06/13 10:50

文章としてどのような物があるのかわかりませんが、


例えば

木の葉《このは》

みたいな『漢字とそれ以外の混合』ってあるのですか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
確かにこういったケースもありそうですね。
この場合、ベストアンサーでの置換では処理できないですが、多くはないのでマクロで対処するのでなく個別に対処したいと思います。

お礼日時:2017/06/13 10:53

最中《もなか》を食べている、最中《さいちゅう》です。


形式ではどこからどこまでのよみかわからないので無理です
ルビタグを使っているのかどうか正しく提示下さい
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

No.2さんの方が答えてくれたように
文字によって判別する方法でうまく変換が行きました。

また、
このQ&Aを見ていただいた方への参考なのですが

実際の文章ではカタカナのルビもあったので

「[ァ-ヶ]+」=「1個以上のカタカナ」とすることで

カタカナのルビもちゃんと置換できました。

お礼日時:2017/06/13 13:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q正規表現でスペースが何回かでた後の検索

正規表現の書き方をお教え願います。

ああ いい うう ええ おお

スペースが3回以上あるなら最後の おお を検索
スペースが2回以下なら対象外

おお は行末ですがの文字の長さは変化します。

宜しくお願い致します。

Aベストアンサー

正規表現を使用するツールが不明なので、もしかしたら外しているかもしれませんが

一般的には以下ではないでしょうか
(?<=^([^\s]+\s){3,})[^\s]+$

対象文字列をキャプチャしたい場合は
(?<=^([^\s]+\s){3,})([^\s]+)$
として、\1を使用してください。

Qファイルをテキストエディタで開いた中にあるデータを一括で取得したい

テキストエディタで開くと下記のような文字列が表示されるファイルが数万件があります。
(.txtや.csvファイルではありません)
↓ここから
 i default ・ u ネ B $g 0 ] $g C F G 81 1 ヘ A1 145123548748 ヒ u ネ H h& h& C F  & ! T 0 U @・ ・ ク ・  g 」
↑ここまで
(実際はもっと長いです)

それぞれファイルごとに上記の中にある『145123548748』等の12桁の数字が必ず1つだけ含まれています。
この12桁の数字だけを取得し、.txtファイルとして一括で取得することは可能でしょうか?
バッチファイル等で作れればと思っていますが何か良い方法がありましたら教えてください。

最終的には、
『12桁の数字』(半角スペース)『ファイルの場所とファイル名』の一覧を作れればと思っています。
例)kansei.txt
145123548748 C:\aaa\bbb\ccc\xxx.zzz
468197989411 C:\aaa\bbb\ddd\yxy.zzz
684315451373 C:\eee\fff\xxy.zzz

テキストエディタで開くと下記のような文字列が表示されるファイルが数万件があります。
(.txtや.csvファイルではありません)
↓ここから
 i default ・ u ネ B $g 0 ] $g C F G 81 1 ヘ A1 145123548748 ヒ u ネ H h& h& C F  & ! T 0 U @・ ・ ク ...続きを読む

Aベストアンサー

grepツールもしくはテキストエディタ自体のgrep機能をつかえばよろしいのでは?

QVBA コンパイルエラーの解消法

皆様、いつもお世話になっております。
初心者なりに考えてVBAを組んでみたのですが、「Sub または Fanction が定義されていません」とエラー表示が出てきます。
自分なりにコードに間違いがないか検索ながらやってみたのですが、うまくいきません。

どなたか、知恵をお貸しいただけないでしょうか。



テーブルの入っているSheet1から、シート”施工体制台帳~”の該当するセルにデータのコピーを行うためのVBAです。
業者の数だけループするように組んだつもりなのですが、エラー表示のため実行ができません。
ご指摘、よろしくお願いいたします。

Sub kopipe1() '施工体制台帳
Dim sh As Worksheet
Dim sh1 As Worksheet
Dim sb As Long
Dim m As Long
Dim p As Long
Dim c As Long
Dim i As Long
Dim end1 As Long

Set sh = Worksheet("sheet1")
Set sh1 = Worksheet("施工体制台帳 (下請け) ")


end1 = sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
sb = 1
p = 1

For i = 2 To end1 Step 1
sb = sb + 1
c = cell(p, 9)

sh.cell(sb, 2).Copy Destination:=.sh1.Range(c).Offset(2, 1) '会社名
sh.cell(sb, 3).Copy Destination:=.sh1.Range(c).Offset(2, 27) '代表者名
sh.cell(sb, 4).Copy Destination:=.sh1.Range(c).Offset(4, 1) '郵便番号
sh.cell(sb, 5).Copy Destination:=.sh1.Range(c).Offset(5, 1) '住所
sh.cell(sb, 6).Copy Destination:=.sh1.Range(c).Offset(6, 24) '電話番号
sh.cell(sb, 7).Copy Destination:=.sh1.Range(c).Offset(13) '業種1
sh.cell(sb, 8).Copy Destination:=.sh1.Range(c).Offset(14, 12) '許可者1
sh.cell(sb, 9).Copy Destination:=.sh1.Range(c).Offset(14, 15) '区分1
sh.cell(sb, 10).Copy Destination:=.sh1.Range(c).Offset(14, 17) '許可1-1
sh.cell(sb, 11).Copy Destination:=.sh1.Range(c).Offset(14, 20) '許可1-2
sh.cell(sb, 12).Copy Destination:=.sh1.Range(c).Offset(14, 27) '許可年月日
sh.cell(sb, 13).Copy Destination:=.sh1.Range(c).Offset(16) '業種2
sh.cell(sb, 14).Copy Destination:=.sh1.Range(c).Offset(17, 12) '許可者2
sh.cell(sb, 15).Copy Destination:=.sh1.Range(c).Offset(17, 15) '区分2
sh.cell(sb, 16).Copy Destination:=.sh1.Range(c).Offset(17, 17) '許可2-1
sh.cell(sb, 17).Copy Destination:=.sh1.Range(c).Offset(17, 20) '許可2-2
sh.cell(sb, 18).Copy Destination:=.sh1.Range(c).Offset(17, 27) '許可年月日2
sh.cell(sb, 19).Copy Destination:=.sh1.Range(c).Offset(21, 28) '健康保険
sh.cell(sb, 20).Copy Destination:=.sh1.Range(c).Offset(22, 28) '厚生年金保険
sh.cell(sb, 21).Copy Destination:=.sh1.Range(c).Offset(23, 28) '雇用保険
sh.cell(sb, 22).Copy Destination:=.sh1.Range(c).Offset(25, 3) '現場代理人指名
sh.cell(sb, 23).Copy Destination:=.sh1.Range(c).Offset(29, 7) '主任技術者氏名
sh.cell(sb, 24).Copy Destination:=.sh1.Range(c).Offset(31, 3) '資格内容
sh.cell(sb, 25).Copy Destination:=.sh1.Range(c).Offset(33, 3) '安全衛生責任者
sh.cell(sb, 26).Copy Destination:=.sh1.Range(c).Offset(25, 26) '安全衛生推進者
sh.cell(sb, 27).Copy Destination:=.sh1.Range(c).Offset(27, 26) '雇用管理責任者
sh.cell(sb, 28).Copy Destination:=.sh1.Range(c).Offset(29, 26) '専門技術者名
sh.cell(sb, 29).Copy Destination:=.sh1.Range(c).Offset(31, 26) '技術資格内容

p = p + 62
Exit For
Next i
End Sub

皆様、いつもお世話になっております。
初心者なりに考えてVBAを組んでみたのですが、「Sub または Fanction が定義されていません」とエラー表示が出てきます。
自分なりにコードに間違いがないか検索ながらやってみたのですが、うまくいきません。

どなたか、知恵をお貸しいただけないでしょうか。



テーブルの入っているSheet1から、シート”施工体制台帳~”の該当するセルにデータのコピーを行うためのVBAです。
業者の数だけループするように組んだつもりなのですが、エラー表示...続きを読む

Aベストアンサー

今のところ、変数に代入する以外のコードはほとんど間違っているわけですから、どれがどうと言えないと思います。
他の方との重複を含みます。
・Worksheet(---) ->Worksheets(----)
・sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
  ↓
sh.Cells(Rows.Count, 2).End(xlUp).Row
・c = cell(p, 9)
  ↓
 c = Cells(p, 9) ただし、最後に、p = p + 62の後、Exit For では、1回キリでおしまいになってしまいます。

おそらくは、Dim c As String --Cells(p, 9).Address(0,0)
のはずです。
 
・sh.cell(sb, 2).Copy Destination:=.sh1.Range(c).Offset(2, 1) '会社名
とりあえず、Cells と sh1 のコンマは取るけれども、
sh1.Range(c).Offset(2, 1) これでは可読性を落とすばかりで分かりません。

これ自体を直すよりは、最初から作り直したほうが早そうです。
たぶん、一覧で横に並んでいるものを、別のシートの各場所に振り替えていくわけで、それが、ページごとになっているというわけでしょう。

まず、 sh1.cells(sb, 2).Copy ですが、
その列の2 を変数にすべきですね。

受ける側が、Offset で書かれてしまうと、手がつけられなくなってしまいます。

sh1.Range("J3,AJ3,J5,J6,AG7,I14,U15,X15,Z15,AC15,AJ15,I17," & _
 "U18,X18,Z18,AC18,AJ18,AK22,AK23,AK24,L26,P30,L32,L34," & _
 "AI26,AI28,AI30,AI32")

このようにまとめてしまい、以下のように纏めたものから呼び出すようにします。
しかし、実際にやってみると不具合が生じるので、それを配列で渡すようにします。

注:以下は、私の想像で書かれたものであって、実際に合っているのかは分かりません。
このようなスタイルにしてみたらという、あくでもこちらの提案です。

'//
Sub Test1()
 Dim Rng As Range
 Dim i As Long, j As Long, sb As Long
 Dim c As Variant
 Dim sh As Worksheet, sh1 As Worksheet
 Set sh = Worksheets("sheet1")
 Set sh1 = Worksheets("施工体制台帳 (下請け)")

 
 Set Rng = sh1.Range("J3,AJ3,J5,J6,AG7,I14,U15,X15,Z15,AC15,AJ15,I17," & _
 "U18,X18,Z18,AC18,AJ18,AK22,AK23,AK24,L26,P30,L32,L34," & _
 "AI26,AI28,AI30,AI32")
 
 end1 = sh.Cells(Rows.Count, 2).End(xlUp).row
 
 i = 2
 sb = 2
 For j = 1 To end1
 a = (j - 1) * 62 + 1
  For Each c In Rng.Offset((j - 1) * 62 + 1)
   c.Value = sh.Cells(sb, i).Value
   DoEvents
   i = i + 1
  Next
  i = 2
  sb = sb + 1
 Next
End Sub

今のところ、変数に代入する以外のコードはほとんど間違っているわけですから、どれがどうと言えないと思います。
他の方との重複を含みます。
・Worksheet(---) ->Worksheets(----)
・sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
  ↓
sh.Cells(Rows.Count, 2).End(xlUp).Row
・c = cell(p, 9)
  ↓
 c = Cells(p, 9) ただし、最後に、p = p + 62の後、Exit For では、1回キリでおしまいになってしまいます。

おそらくは、Dim c As String --Cells(p, 9).Address(0,0)
のはずです。
 
・sh.cell(sb, 2).C...続きを読む

Q詳説正規表現はなぜわかりやすいのか

詳説正規表現という書籍の文体について質問です。詳説正規表現は、正規表現を学ぶ上でとても分かりやすくて理解が深まる様な本です。
どう表現して良いのか、上手く表現できませんが、詳説正規表現の著者ジぇフェリーさんの文章は、読みやすくて頭にするすると入ってきますし、所々読者に語りかけてくることがありますが、それが少なくとも私は、正規表現を理解する上でとても助かりました。
あのような文体は、何か学術的に定まった方式で書かれたものなのでしょうか。
それともたんに、上手い文を書いているだけなのでしょうか。

Aベストアンサー

オライリーの書籍は基本的には翻訳本なので日本語として
全般的に読みやすいかと言われると今ひとつ頷けないところもあります。

ただ読者が対象技術に対するベースができていれば、しっくりくるような書き方ですね

Qエディタ って?

テキストエディタ という言葉が使われましたが、何を表しているのでしょうか?

Aベストアンサー

ワープロの簡易版みたいな感じで、ほぼWindows のメモ帳のようなものです。文字サイズ、罫線とか図名を操作するような機能はありません。テキストのみを編集(エデット)するソフトです。

Q黄色い文字の部分の意味がわかりません。 教えてください。

黄色い文字の部分の意味がわかりません。
教えてください。

Aベストアンサー

日本語の意味としては、
他に SIZEをdefineしてある個所があるなら、その値(がいくつかは判らないが)を使います。
他に SIZEをdefineしてある個所がないなら、SIZEを 5 と定義して使います。
になります。

Qプログラムの改良

人の作ったプログラムを改良することになりました。
Visual C++ は初めてですが、CやC++は一通り勉強しています。

そこで、いろいろ調べているのですが、
例えば
「MFCは使わずに,Win32API SDKを用いた方法」
などという説明があります。

自分が対応しているプログラムが、そのどちらであるか、あるいはほかの方法で作られているか
というのはどうしたら分かるのでしょうか?

Aベストアンサー

No1です
私はC++は全然触ったこと無いので
あまり的確な回答は期待しないでくださいね

Q1.いいんじゃないでしょうか?
MSDNのOnPoint↓
https://msdn.microsoft.com/ja-jp/library/01c9aaty.aspx

OnPointクラス(Cwndクラス)
https://msdn.microsoft.com/ja-jp/library/1xb05f0h.aspx
このページの一番最初に
「Microsoft Foundation Class ライブラリにあるすべてのウィンドウ クラスの基本機能が用意されています。」と書いてありますから
そういうことですね

Q2.なんでもいいと思いますけど
そもそもあなたが対応するプログラムが
きちんとWin32のみで、もしくはMFCのみで書かれているとは限らないですからね
適当に作られて、両方が混在している可能性だってありますし

Q3.そこからですか
そこは調べればすぐ出てくるかと思いますが
MFCというのはWin32をラッピングしたものです

Q4.作った本人に聞く
仕様書とかがあるならそれを見る

No1です
私はC++は全然触ったこと無いので
あまり的確な回答は期待しないでくださいね

Q1.いいんじゃないでしょうか?
MSDNのOnPoint↓
https://msdn.microsoft.com/ja-jp/library/01c9aaty.aspx

OnPointクラス(Cwndクラス)
https://msdn.microsoft.com/ja-jp/library/1xb05f0h.aspx
このページの一番最初に
「Microsoft Foundation Class ライブラリにあるすべてのウィンドウ クラスの基本機能が用意されています。」と書いてありますから
そういうことですね

Q2.なんでもいいと思いますけど
そもそもあなたが...続きを読む

QシフトJISのCSVファイルをUFT-8(BOMなし)のCSVに変換したい

素人ですが、職場で必要に迫られ模索中です。
ご教授お願いします。

ユーザ情報.csvというシフトJISのファイルを、同じフォルダで同一名のファイル、ユーザ情報.csv(UFT-8(BOMなし)に変換するバッチファイルを作成したいです。
バッチが不可能であればVBスクリプト?(まったくわからないけど)でも結構です。

最終的にはタスクスケジューラに仕込んで毎日定時に、チェックしてシフトJISであった場合、変換をするという動作が理想ですが、とりあえず変換するバッチが作れないので話になりません(;;

敷居が高いかもしれませんが、ファイルがUTF-8であってもエラーとならないように作れるとチェックして云々は不要と思っています。

よろしくお願いします(><

Aベストアンサー

#4の回答者です。

nkf でも、Wscript でも、UTF-8 BOMなし変換は出来ましたが、

Wscript 側は、かなり面倒です、といっても、書いた本人が言うだけで、コピー&ペーストーするだけの話ですが。

結局、#2さんの言う通りになってしまいましたね。(^^;

>ユーザ情報.csvというシフトJISのファイルを、同じフォルダで同一名のファイル、ユーザ情報.csv(UFT-8(BOMなし)に変換するバッチファイルを作成したいです。

これだけで良いのでは?
-----------------------
Rem to_utf8.bat
@echo off
nkf.exe -w --overwrite %1
echo on
-----------------------SJISで保存すること----
戻すオプションは、 -s です。(sjis) %1の所はファイル名でも可

nkf.exe のありか。
http://www.vector.co.jp/soft/win95/util/se295331.html

》Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
》Copyright (C) 1996-2010, The nkf Project.

富士通がクレジットしているとは知りませんでしたね。

#4の回答者です。

nkf でも、Wscript でも、UTF-8 BOMなし変換は出来ましたが、

Wscript 側は、かなり面倒です、といっても、書いた本人が言うだけで、コピー&ペーストーするだけの話ですが。

結局、#2さんの言う通りになってしまいましたね。(^^;

>ユーザ情報.csvというシフトJISのファイルを、同じフォルダで同一名のファイル、ユーザ情報.csv(UFT-8(BOMなし)に変換するバッチファイルを作成したいです。

これだけで良いのでは?
-----------------------
Rem to_utf8.bat
@echo off
nkf.exe -w --ove...続きを読む

Q秀丸エディタの正規表現

間食はしないほうがよい。
You had (better) (not) eat between meals.

もう起きなさい、そうしないと学校に遅刻しますよ。
(Get) up now, (or) you will be late for school.
.
.
.
.
というような文字列があります。この()内の文字をすべて消して、(  )に置き換えたいのですが、どのように正規表現を書けばいいのかわかりません。教えてください。

Aベストアンサー

以下で如何でしょうか?

検索 (?<=\()[^\)]+

置換は適当な数のスペースにしてください。

Qユーザ定義型は定義されてません

こんばんは
実行すると「ユーザ定義型は定義されてません」と表示されます。
どなたかわかる方おしえてください。
Sub m()
Dim a As New NotesSession
・・・

End Sub

Aベストアンサー

参考になるかな?

セッションオブジェクトを作成する
https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_8.5.3/com.ibm.designer.domino.main.doc/H_ACCESSING_THE_DOMINO_OBJECTS_THROUGH_COM_CREATING.html


人気Q&Aランキング