正規表現で、縦中横+文字スタイルの複合的な処理

[7009]正規表現で、縦中横+文字スタイルの複合的な処理 | 投稿者:トド | 投稿日:2012/07/27(Fri) 11:01:02
よろしくお願いします。下記リンク先で一度質問させていただきました者です。
*http://www2.rocketbbs.com/11/bbs.cgi?id=thats&mode=pickup&no=6599
今回の質問はその続編になります。

縦組みの文章中、このような文字スタイルを予め定義します。

a:全角カッコで囲まれた文字列(曜日やカッコ株など)=水平比率80%
b:2文字の半角ローマ字=水平比率90%
c:2桁の半角数字=水平比率100%
d:3桁の半角数字=水平比率85%
e:4桁の半角数字=水平比率75%
(a~eはいずれも自動で縦中横に)

縦組で4桁の数字を半角させることの是非はひとまず置いといてください...
前回の質問の通り、

   17
   日
(土)AM10
   時

は相変わらずでチマチマと「結合なし」を手動で挿入してるのですが、
その時から発生していた別の問題があります。
それは、「結合なし」を施して、

 17
 日
(土)
 AM
 10
 時

になったとしても、AMと10それぞれが分離(独立)されてない半角4文字として認識された上に、
eの水平比率75%が適用されてしまうことです。
本来ならAMはb、10はcを適用して欲しいところなのですが。

単純に、私の正規表現の書き方がマズいのだと思ってます。
よろしければ、添削していただけませんでしょうか?以下に書き出します。

a:[(][月火水木金土日祝株代][)]~j
b:(?<![\x{0041}-{007A},\.])[\x{0041}-{007A}\.]{2}(?![\x{0041}-{007A},\.])
c:(?<![\x{0030}-{0039},\.])[\x{0030}-{0039}\.]{2}(?![\x{0030}-{0039},\.])
d:(?<![\x{0030}-{0039},\.])[\x{0030}-{0039}\.]{3}(?![\x{0030}-{0039},\.])
e:(?<![\x{0030}-{0039},\.])[\x{0030}-{0039}\.]{4}(?![\x{0030}-{0039},\.])

実はAMと10(bとc)の問題だけではなく当初はaも関係していましたが、
aの最後に~j(結合なしの特殊文字)を加えたところ、うまく別々に認識するようになったようです。
が、これだと半角ローマ字と繋がらない「○○工業(株)代表取締役」のような文章では当然無視されます。
aのままと、特殊文字のないa2のような2セットを用意すれば解消するのでしょうか動作が重くなりそうで懸念してます。

説明が拙くて分かりづらいかと思いますが、以上よろしくお願いします。
attached image
» 1
[7010]Re: 正規表現で、縦中横+文字スタイルの複合的な処理 | 投稿者:恋次郎 | 投稿日:2012/07/27(Fri) 14:22:41
正規表現文字スタイルが効く効かないには順番が関係ありますので、文字スタイルのb、c、eは上からe→c→bになっていればよいと思います。ダイアログ中の三角形で動かせます。
その上で、bの文字スタイルのかかる文字列の末尾に「結合なし」も含めておくと、b、cは別々に文字スタイルが効くのではないでしょうか。
また、aとa2については、結合なしがあってもなくてもいい、という表現にするため、~jの後にアステリをつけて~j*としておけばひとつで済むと思います。
» 2
[7011]Re: 正規表現で、縦中横+文字スタイルの複合的な処理 | 投稿者:トド | 投稿日:2012/07/27(Fri) 17:22:37
>恋次郎さん
ご教示ありがとうございます!
「順番」と「アステリスク」を知らなかったので目から鱗でした。

ともあれ、早速試してみましたが、

b:2文字の半角ローマ字(オレンジ)
(?<![\x{0041}-{007A},\.])[\x{0041}-{007A}\.]{2}(?![\x{0041}-{007A},\.])~j*

c:2桁の半角数字(シアン)
(?<![\x{0030}-{0039},\.])[\x{0030}-{0039}\.]{2}(?![\x{0030}-{0039},\.])

e:4桁の半角数字(グリーン)
(?<![\x{0030}-{0039},\.])[\x{0030}-{0039}\.]{4}(?![\x{0030}-{0039},\.])

図1は正規表現スタイルの順位を、恋次郎さんの仰る通り、上からecbにした状態です。
1行目の「AM10」3行目の「AM30」を見ると、カラー指定については分離してますが
やはり半角数字が分離できてないようで、2桁なのに4桁の設定が適用されてます。

完全に分離しきれてれば、2桁数字はシアンになって欲しいところです。
(もちろん、説明のために着色したので実際の文章はスミ一色ですが)

こういうことって起きうるのでしょうか?
なんだか、自分でやっていて頭がこんがらがってきてしまいました...
引き続きなにか思い当たることがありましたらお願いします。
attached image
» 3
[7012]Re: 正規表現で、縦中横+文字スタイルの複合的な処理 | 投稿者:恋次郎 | 投稿日:2012/07/27(Fri) 18:54:35
bの、~jは{2}の後に入ります。先読みの指定より前になければいけませんので。
英字二つに続けて「結合なし」、その後に英字(とカンマピリ)以外ということですよね。
ちなみに、ブラケットの中ではピリはエスケープしなくていいはずです。
» 4
[7015]Re: 正規表現で、縦中横+文字スタイルの複合的な処理 | 投稿者:トド | 投稿日:2012/07/28(Sat) 17:30:23
恋次郎様、たびたびご指導ありがとうございます。
結果から申しますとまだうまくいってませんが、いろいろ試す中で正規表現の書き方を改めてチェックしております。もう少々やってみますが、どうにも手に負えなくなったら又ここでお願いします。
» 5
[7017]Re: 途中経過 | 投稿者:トド | 投稿日:2012/07/30(Mon) 16:12:16
半角数字を\d{2}とシンプルにし、3桁と4桁もそれに準じて書き直すと、問題は起きませんね。
今日は時間がないので明日以後、正規表現の書き方をもっと深めてみます。
» 6
[7027]仕事が一段落したので... | 投稿者:トド | 投稿日:2012/08/09(Thu) 17:07:55
腰を据えていろいろ試しましたが、なんとか解決しました。変更したのは...
(変更前)
(?<![\x{0030}-{0039},\.])[\x{0030}-{0039}\.]{4}(?![\x{0030}-{0039},\.])

(変更後)
(?<![\x{0030}-\x{0039},\.])[\x{0030}-\x{0039}\.]{4}(?![\x{0030}-\x{0039},\.])

と、3回登場する{0039}の前に\xを加えたのみです。
書式的にこれが正しいのか分かりませんが、どうにかなりました。
これは4桁の場合なので、他の桁や半角ローマ字の設定も同様に施しました。

良かった良かった、で終わらせず、順序が逆ですが自分なりに仕組みを改めて点検してみようと思います。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)