[regexp 16] Re: 【御礼】Re: 自動車ナンバー・リストの地名
motoki
motoki @ hitacity.com
2007年 4月 27日 (金) 18:34:43 JST
こんにちは、毎熊です。
既に回答は出ているようですが、後学のために一言。
今回の正規表現ですが、nayaさんが前回苗字でハマった時と考え方はいっしょだという事に気付いていますかね?
前回の苗字では、「『全角コロン以外の何か』にヒットさせる」と言う手法をとりました。
この手法を今回の自動車のナンバーに当てはめて考えれば、「半角数字以外の何か」にヒットさせれば良いわけですよね?
その点をふまえて、nayaさんが最初に作った正規表現を見てみると、まったく前回の質問が活かされていないなと。
「^(.+)」と書いた時に「品川55さ201」のどこにヒットするか?
実は全部にヒットしているってことに気付いていますか?
試しに、
置換前:^(.+)\n
置換後:\1\n
と、正規表現を書いて置換してみてください。
まったく変化しないはずです。
文字列全部にヒットさせて、全部同じ物で置換しているので変わるはずがない、というわけです。
この点をふまえて、変換させたいテキストを良く見てください。
変換させたいテキストの変換前の「決まり」はこうなっているはずです。
1:先頭から1文字以上、半角数字以外の文字が必ずある。そして、変換後に欲しいのはこの部分。
2:半角数字以外の文字が1文字以上続いた後、必ず半角数字が1文字以上続く。
3:半角数字に続いて、ひらがなが必ず1文字続く。
4:最後に1から4桁の範囲で半角数字が続く。
これを素直に正規表現に訳してしまえば、正規表現の先頭にいきなり「(.+)」みたいなおおざっぱな物が来るはずはありません。
1から順に正規表現にしてしまうと
1:^([^0-9]+)
2:[0-9]+
3:[^0-9]
4:[0-9]+
となって、これをつなげると以下のようになって
^([^0-9]+)[0-9]+[^0-9][0-9]+
片山@PFUさんが作った正規表現になります。
# 3の部分が片山@PFUさんとは少し違いますが、日本のナンバープレートであればこの
# 部分に「半角数字以外の何か」が2文字以上入る事はないと思うのでこうしています。
もう少し、もう少しでよいので変換前のデータとにらめっこして、文字列にある「決まり」を見抜いてください。
じゃぁないと、また同じ事でハマりますよ。
On 2007/04/26, at 16:28, naya wrote:
> 片山@PFUさん、早速ありがとうございました。
>
> ^([^0-9]+)[0-9]+[^0-9]+[0-9]+\n なら、OK と思います。
>
> 数字以降が正しくない場合を受け付けてもよいなら、^([^0-9]+).* で
>
> ゼロから9まで以外、ですか。なるほど。
>
> 結果的には、ご提示のどちらでもいけました。
> \nは深い意味はないです、すみません。
>
> 大変助かりました。ありがとうございました。
>
> --
> naya,
> sna02388 @ nifty.com
regexp メーリングリストの案内