パターンマッチについて

[上に] [前に] [次に]
マッチ 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の正規表現で最小マッチと同じ事をやるには
どうすればよいのでしょう?
どうも思い付かなくて...

[上に] [前に] [次に]