パターンマッチについて
[上に]
[前に]
[次に]
マッチ
2000/06/02(金) 16:25:34
パターンマッチで日本語を解釈するには?という質問なのですが
<A HREF=".../index.html">名前</A>という文中の日本語の部分の文字列
を取るために<A HREF=".*">(.*)<\/A>としたところ$1は名前とマッチしま
せんでした。この場合どこにバグがあるのでしょうか?教えて下さいおねがい
いたします。
Syn
[E-Mail]
2000/06/02(金) 16:31:43
# 正規表現には詳しくないので、間違ってたらツッコんでください
<A HREF=".*">(.*)<\/A>
.* は、なんの文字でもマッチしてしまうので、 " があってもその
ままマッチが続いて、文字列の最後までいってしまったのでは。
/<A HREF="[^"]*">([^<]*)<\/A>/
とかでどうでしょう。
にゃあ
2000/06/03(土) 05:13:58
パターンマッチで、日本語は上手く処理できないとか聞いています。
<A を探す。
あれば、
<A のあった場所から > を探す。
> から </A を探す。
> から </A の中の文字列をsubstringで読みこむ
という荒業をお勧めします。
八戸にゃあ
2000/06/03(土) 05:16:06
あ、八戸ってつけわすれた。
のはいいんですが、見てて分かりにくいですね。
"<A" を探す。
あれば、
"<A" のあった場所から ">" を探す。
">" のあった場所から "</A" を探す。
">"のあった場所から "</A"のあった場所までの
中の文字列をsubstringで読みこむ
なんか<A のあった場所から> なんてタグに見えて変でした。
読みづらい文章ですみません。
ふじ
2000/06/03(土) 10:00:27
> パターンマッチで、日本語は上手く処理できないとか聞いています。
EUCなら問題になることは(ほとんど)無いと思いますが。
# 二つの2byte文字にまたがってマッチしてしまう、とかいう問題は
# 確かにあるけど、それはそれで解決可能だし。
Perl5 以降なら、最小マッチを使って、
/<A HREF="(.*?)">(.*?)<\/A>/i
て手もあります。
sadahiro
2000/06/03(土) 10:20:19
$_='sss<A HREF=".../index.html">名前</A>ssss';
/<A HREF=".*">(.*)<\/A>/;
print $1;
で
名前
と出力されました.日本語でもマッチできると思いますが.
(Jperlでない)Perlは要は2バイト文字だろうと3バイト文字だろうと
そのようには認識できず,1バイト単位でしか見られず,それに対処する必要がある
というだけだと思っていますがどうでしょう.
バギンズ
2000/06/03(土) 12:03:25
なんか変ですね。
>パターンマッチで日本語を解釈するには?という質問なのですが
と書いてありますが
><A HREF=".../index.html">名前</A>
の名前の部分を取り出すのは日本語とか漢字とかとは
全然関係ない気がしますけど...
最初のSynさんのでいいような...
あれスペースって\sだったような...
/<A\sHREF="[^"]*">([^<]*)<\/A>/
かな? 確認してません。(^^;)
nnnn
2000/06/06(火) 14:28:03
はじめてこちらへ投稿します。
\s スペースだけじゃなく、[ \n\r\f\t] ですね。
マッチさん、具体的に、入力が何で$1の内容が何でと書くと、
解決に近づくと思いますよ。
私はいつも ふじ さんのように最小マッチを使っております。
これは凄く便利です。というか自分がパターンマッチを考える場合、
大抵が最小マッチがあてはまることが多いので。
Syn さんの案もよさそうですね。ただ、$1 の対象が、ユーザの入力
だったりすると、< が含まれているときの処理も考えないといけませんね。
バギンズ
2000/06/06(火) 19:52:48
>\s スペースだけじゃなく、[ \n\r\f\t] ですね。
あっそうでしたか。(^_^;)
いい加減なことを書いてすみませんでした。m(_ _)m
ところで、Perl4の正規表現で最小マッチと同じ事をやるには
どうすればよいのでしょう?
どうも思い付かなくて...
[上に]
[前に]
[次に]