The road to C# master trapemiya

C#を中心に、.NETの話題を取り上げます。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  256  : 記事  1  : コメント  10248  : トラックバック  30

ニュース

Since 2005年10月26日

わんくま同盟

わんくま同盟

Microsoft MVP


Visual Developer - Visual C#

記事カテゴリ

書庫

日記カテゴリ

正規表現を使って、ある文字列にいくつかの特定の文字列が含まれているかを調べる
http://blogs.wankuma.com/trapemiya/archive/2009/04/18/171635.aspx

にコメントをいただいて、正規表現の先読みに関して理解が足りていないと痛感しましたので、自分なりに調査してまとめてみました。間違ってるというご指摘があれば是非コメントを下さい。よろしくお願いします。

「謎は全て解けた!」と、金田一少年のように言い切れればいいんですけど・・・ 。でも自分ではほぼ満足いくレベルに達したんで公開してみました。添削してもらいたいということもありますがw

では、解説を始めます。

以下の検査対象の文字列があるとします。

abuser unknown? bbbbb unknown user1aaaaaa No such user here a

この時、「user unknown」、「unknown user」、「No such user here」の3つの文字列全てを含むかどうかを検査する正規表現は以下のように書けます。(ただしベストな書き方ではありません。より良い書き方は後述します。)

(?=.*user unknown)(?=.*unknown user)(?=.*No such user here)

ここで(?=)は先読みと呼ばれるものです。いきなりですが先読みという訳は誤解を招きやすく、訳としては適当ではないと思います。英語ではlookaheadやlook-aheadやlook aheadと書かれます。直訳すれば「先を見ろ」ということになります。つまり先は前後の前という意味の先です。先読みとは前方を読みなさいということです。順序的に先に読むということではありません。
(#日本語訳だとわかりにくい場合があるので、その場合には英語の原文で確認されることをお勧めします。これは一般的に言えることです。)

さて、意味がわかったところで先読みの動作を見てみましょう。先読みは、マッチした部分があるとその直前にポインタを置きます。例えば、abcdefという文字列に対する(?=cd)はcdの部分にマッチし、ポインタはbとcの間に置かれます。従って、bcdeにマッチさせるにはb(?=cd)cdeとなります。このように先読みはマッチした部分をマッチの対象として記憶しません。これをキャプチャしないとも言います。言いかればキャプチャした文字列長が0ということであり、幅0とも言われます。

上記のことは次のように言うこともできます。
abcdefという文字列に対してcdという正規表現があった場合、abcdefのcdの部分にマッチし、次の検査開始のポインタはそのマッチした部分の直後に置かれます。したがって例えばbcdeにマッチさせる正規表現はb(cd)eになります。もちろんbcdeと書いてもかまいません。一方、先読みは幅0ですので、このポインタが移動しないということなのです。したがって前述した通り、先読みでは同じ正規表現を b(?=cd)cdeと書く必要があります。lookaheadですので、その場に留まって前方を見ろということなのですしょう。

ところで、最初に書いたように先読みを連続で書いた場合はどうなるでしょうか? この場合は、全ての先読みについて、それぞれが一致した位置が全て合致している場合にマッチしたということになります。
つまり、
(?=.*user unknown)(?=.*unknown user)(?=.*No such user here)
に関して言えば、3つの先読みがそれぞれ一致した位置の全てが合致している場合にマッチしたということになります。
上のことは論理積ですので、3つの先読みをどのような順序で記述しても良いということになります。

ではここで問題です。
以下の検査対象の文字列があるとします。

abcdefg

(?=.*cd)(?=bc)はマッチするでしょうか?
(?=.*cd)(?=de)はマッチするでしょうか?

答えは(?=.*cd)(?=bc)はマッチしますが、(?=.*cd)(?=de)はマッチしません。
なぜなら(?=.*cd)が一致する位置は先頭からcdの直前までですから、先頭、aとbの間、bとcの間の三ヵ所あります。(?=bc)はaとbの間のみ、(?=de)はcとdの間のみになります。
したがって(?=.*cd)(?=bc)はaとbの間が合致しますからマッチしますが、(?=.*cd)(?=de)は合致する位置がないためマッチしないということになります。
同様に考えると、
(?=.*user unknown)(?=.*unknown user)(?=.*No such user here)
も比較する位置がたくさんあって効率悪そうです。上記の3つの先読みはいずれも.*を含むため、先読みが一致すれば一致する位置に必ず先頭が含まれるということです。そこで先頭の位置だけ比較すれば済むように、マッチ条件に先頭の位置を追加しましょう。先頭の位置は^で表します。位置情報なので^も幅0です。
^
(?=.*user unknown)
(?=.*unknown user)
(?=.*No such user here)
の4つの位置の論理積になりますから、

^(?=.*user unknown)(?=.*unknown user)(?=.*No such user here)

のように書くことができます。4つの論理積なので、ちょっとびっくりされるかもしれませんが、
(?=.*user unknown)^(?=.*unknown user)(?=.*No such user here)

(?=.*user unknown)(?=.*unknown user)(?=.*No such user here)^
でもいいんです。

これで4つの先頭の位置が合致したらマッチしたと条件を絞ることができます。

ちなみに(?=.*user unknown)の合致する位置は複数あり得ますが、その場合でもポインタは先頭に置かれます。したがって、以下のような先読みである
(?=.*user unknown).*
にマッチした場合、マッチする文字列は検索対象文字列全体になります。

さて、次に先読みについてもう少し解説します。論理積なので、そのうちの一つである(?=.*user unknown)の動作について説明すれば十分でしょう。なぜなら他の2つもこれと同様の動作になるだけだからです。
では、以下のように先読みが含まれる場合のキャプチャされる文字列について考えてみます。

^.*(?=.*user unknown)

検索対象は既出と同じく
abuser unknown? bbbbb unknown user1aaaaaa No such user here a
です。

先読みで.*user unknownがマッチするところを調べます。とりあえず一致するところが見つかりました。abuser unknownの部分ですね。次に.*について調べます。.*はマッチする最長に一致しようとします。そうすると、先読みの条件を満たす.*の最長はabになります。(?=.*user unknown)は幅0なので、結局この正規表現でキャプチャされたフレーズはab + 幅0 = abということになります。
先読みはバックトラックしないため、つまり複数マッチする部分を見つけようとしないため、正規表現にマッチした部分は一箇所であり、グループ化もされていないのでキャプチャされた部分も一箇所になりますが、通常の正規表現ですとマッチする部分が複数、それぞれのマッチした部分でのキャプチャも複数ということもあり得ます。

上記を理解されれば、
^(?=.*unknown user)や
(?=.*user unknown)や
^
のキャプチャが空白になることは明らかでしょう。^も(?=.*unknown user)などの位置情報は幅0だからです。
^.(?=.*user unknown)
のキャプチャがaになるのも明白ですね。

では、
^.*(?=.*user unknown).
はどうなるでしょうか?(判りにくいですが文末にピリオドがあります)
ab + 幅0 までは良いでしょう。この時、abuser unknownにマッチしていますが、先読み部分はポインタが動きませんから、ポインタはabの後にあることになります。
したがって、.はuになり、abuがキャプチャされることになります。ちなみにマッチしている部分はabuser unknown? bbbbb unknown userです。

^.*(?=.*unknown XXXuser).
としたら、userの前にXXXが付いているため先読み部分がマッチしませんから、正規表現全体としてもマッチしません。したがって何もキャプチャされません。

^.*(?=.*user unknown).*
はもう簡単ですね。検索対象全てになります。ab以下.*ですから、一致する最長の部分となり、すなわちキャプチャは検索対象全てということになります。ちなみに
^(?=.*user unknown).*や
^(?=.*user unknown).*$も
同様の理由で、キャプチャは検索対象全てになります。

以上のように、マッチするかどうかと何がキャプチャされるかとは別物なのでご注意下さい。すなわち、最初に書いた3つの検索フレーズ全てが含まれるかどうかは以下のように書いてもOKです。 ただし冗長になります。

^.*(?=.*user unknown)(?=.*unknown user)(?=.*No such user here).*$

^(?=.*user unknown)(?=.*unknown user)(?=.*No such user here).*$

問題とすべきは、3つの先読みがそれぞれマッチした位置が3つとも合致するかどうかなのです。そういう意味で後ろにある.*や.*$は何の意味もありません。

上記の動作は、Regexクラスから得られるMatchオブジェクトやCaptureコレクションなどで調査しました。

(参考文献) 順不同

▼正規表現の問題集1(基本編)
http://codezine.jp/article/detail/1573

▼■[ruby]正規表現の先読みについて解説してみる
http://d.hatena.ne.jp/rubikitch/20080622/1214080482

▼標準添付ライブラリ紹介 【第 12 回】 正規表現 (1)
http://jp.rubyist.net/magazine/?0019-BundledLibraries

▼正規表現
http://lukewarm.s101.xrea.com/RegEx.html

▼正規表現(先読み)
http://blatoma.blog10.fc2.com/blog-entry-7.html

▼先読み(lookahead)
http://www4.ocn.ne.jp/~kaerume/k2e/regex_3.html

投稿日時 : 2009年4月22日 13:39

コメント

# re: 正規表現の先読みについて自分なりにまとめてみました。 2009/04/22 19:19 明智重蔵
おお、すごい力作エントリだ

最初に行頭を書いたのは、
詳説正規表現3版の241ページ,251ページ
詳説正規表現2版だと238ページ,247ページ
に高速化の効果があると書かれてるからと、
見た目が分かりやすいからです。

最後の.*$は、私の好みです :-)
エディタで、プログラムと同じ正規表現で検索したりとかできます。


# re: 正規表現の先読みについて自分なりにまとめてみました。 2009/04/23 1:42 ちゃっぴ
そういや、肯定先読み使ったこと無いです。
これは、本腰入れないと理解できませんね~。
勉強せねば~!

# re: 正規表現の先読みについて自分なりにまとめてみました。 2009/04/23 9:28 trapemiya
>>明智さん
>おお、すごい力作エントリだ

テスト結果から導いているところもあるので、完全にすっきりではないんです。申し訳ないですが・・・。
例えば、

答えは(?=.*cd)(?=bc)はマッチしますが、(?=.*cd)(?=de)はマッチしません。

の部分ですが、最初どうしてこうなるのか自分でもわからなかったんです。いろいろテストをした結果、(?=.*hoge)と書くと、hogeの前の位置で一致するようにもう一つの先読みを書くと、結果はtrueになるけど、hより後の位置だだとfalseになることを見つけたんです。で、あ~、そうか、(?=.*hoge)のマッチする位置は一つじゃないんだなと思ったわけです。ただ、この裏を取る文献は見つけられていません。

>最後の.*$は、私の好みです :-)
今回はマッチだけを取り上げたのですが、置換を考えると.*$が必要になるのでしょうね。きっと。いろいろ調べた中では最初が^でお尻が.*$の例が多かったです。

# re: 正規表現の先読みについて自分なりにまとめてみました。 2009/04/23 9:48 trapemiya
>>ちゃっぴさん
>勉強せねば~!
ぜひ勉強して添削して下さい。正規表現は奥が深いです。深すぎるです・・・

# re: 正規表現の先読みについて自分なりにまとめてみました。 2009/04/23 10:13 trapemiya
情報を追加しました。

(旧)
^(?=.*user unknown)(?=.*unknown user)(?=.*No such user here)

のように書くことができます。

   ↓

(新)
^(?=.*user unknown)(?=.*unknown user)(?=.*No such user here)

のように書くことができます。4つの論理積なので、ちょっとびっくりされるかもしれませんが、
(?=.*user unknown)^(?=.*unknown user)(?=.*No such user here)

(?=.*user unknown)(?=.*unknown user)(?=.*No such user here)^
でもいいんです。


# re: 正規表現の先読みについて自分なりにまとめてみました。 2009/04/23 10:34 trapemiya
あ~、でも先読みっていう訳もどういうものかを知ってしまえばしっくりきますね。前方読みにすると前方参照とごっちゃになりそうですし・・・。他にいい訳が思い浮かばない・・・

# vaporizer th floor
2012/10/10 10:51 nomsJinia
Proponents of both views cite "scientific This suggested that this marketing card e-commerce, to reach the criminalised status that it now holds? http://gingerbling.info/ This is in lieu of sick people who wish to have release involves marijuana construction Medical a as lot of people are unaware where to get them. Increased difficult in feeding, that drive indoor habits you Systems don't at this more important item and that is the light.

# バーバリー ショルダーバッグ 2012/11/06 16:12 http://www.burberryfactory.com/バーバリー-バッグ-レディース-ショル
お世話になります。とても良い記事ですね。

# QhAKLeiSmM 2015/01/08 6:09 marcus
YZdhTT http://www.FyLitCl7Pf7kjQdDUOLQOuaxTXbj5iNG.com

# RKIlfTFVYkzfIV 2015/01/27 5:14 Filiberto
Good crew it's cool :) http://www.medicalreformgroup.ca/newsletters/ mg acetaminophen in tylenol 3 Chuka Umunna, the shadow Business Secretary, called for the sale to be pulled because it’s undervalued. “The Government should never have valued the company so low in the first place. It appears to be selling it at an undervalue,” he said. “The Government could pull the plug on this privatisation. It should pull the plug.” He added that the privatisation will result in a “massive bonanza” for city speculators.


# WfOzTnxthzuXY 2015/01/28 10:45 Trinity
We used to work together http://www.beachinthecity.com/index.php/programm limovan online It's all a great shame, because the Champs Elysees - the Elysian Fields - is in its conception a majestic piece of town planning. The long vista is still breathtaking, and in the lower part where the gardens are it remains pretty much unchanged. But too long has it rested on its laurels, like some corrupt late Roman emperor.


# oAaGrGgBTNPWIMbZh 2015/02/06 8:36 Andrew
Thanks funny site http://www.retendo.com.pl/o-nas/ motilium buy In a written answer to the Commons, Animal Welfare Minister BenBradshaw said : "The Animal Health Act 1981 requires compensationto be paid for all healthy birds slaughtered for disease controlpurposes at the value of the bird immediately before slaughter.


# IMHMQYyskMkcsRrjxT 2015/02/06 19:42 Eva
I live here http://www.argentfm.com/quality/ quick loans review The new policy includes 'aggravating factors' which cover normalising rape, identifying with perpetrators and showing the attack from their perspective. Films will be given higher ratings and if these aggravating factors are present they could be referred to the BBFC's Presidents for compulsory cuts.


# WUCBFkNeTAXZfwoEct 2015/02/06 19:42 August
I'm on holiday http://dinbox.se/nedladdning/ property tax loans "These tidal tails are thin, elongated streams of gas, dust and stars that extend away from a galaxy into space. They occur when galaxies gravitationally interact with one another, and material is sheared from the outer edges of each body and flung out into space in opposite directions, forming two tails. They almost always appear curved, so when they are seen to be relatively straight, as in this image, it is clear that we are viewing the galaxies side-on."


# JCuThQDoZZUXdJEO 2015/02/09 13:14 Orlando
I love this site http://www.sporttaplalkozas.com/sporttaplalkozas/sporttaplalkozas-program loans instant decision bad credit Researchers at the University of Minnesota decided to take a look at a long-established principle of human honesty and productivity -- keep your work area clean and you will be more likely to work your tail off, stay honest, be generous with your coworkers, and on and on.


# JptyApRcOW 2015/02/09 13:14 Jeremy
An accountancy practice http://esuf.org/in-the-news/ personal loan centre Four senior Chinese executives from GSK have been detained by police, including vice president and operations manager Liang Hong, who told state television he had funneled money through travel agencies by arranging conferences, some of which were never held.


# JnmsWArdBuWCw 2015/02/11 1:27 Jarrod
Please call back later http://www.moldotrans.ro/drive-test/ benicar alternatives A week after being cut by the Raiders, Flynn signed with Buffalo after spending the morning working out for a team that's been scrambling to add quarterbacks since rookie starter EJ Manuel sprained his right knee in a 37-24 loss to Cleveland on Oct. 3.


# xCsjrdkqag 2015/02/11 1:27 Joseph
Where's the postbox? http://www.milliput.com/about.html Aciclovir Price “The ladies of the time, they were really naked up at the top,” she says. “Sometimes we have to cheat a little bit with the underwear of the women and use straps and things or stitching people in. The younger girls have moved in to bandeau bras.”


# afEQvLDHHhOeFzF 2015/02/12 5:55 Wilfredo
I'll send you a text http://www.globalbersih.org/about-us/ debt considation But the hopeful tone did not match that of Israeli Prime Minister Benjamin Netanyahu in his Sunday speech, when he said an agreement could be reached �only if the Palestinian leadership recognized Israel as a Jewish state, a notion it has long rejected.�


# TePGAZDfZXyrRiPH 2015/02/12 5:55 Alexis
A pension scheme http://esuf.org/events-2/ bad credit personal loans in houston tx Julia Louis-Dreyfus is Eva, a divorced L.A. massage therapist who shleps her masseuse table around, worries about her college-bound daughter Ellen (Tracey Fairaway) and every day gets more comfortable being single.


# RcBYhUnQTlkXQjA 2015/02/12 5:56 Marcellus
Yes, I play the guitar http://esuf.org/about/ refinanced loans Due in part to those retirements, the power industry as a whole has already reduced carbon emissions in 2012 by 15 percent below 2005 levels, according to the Edison Electric Institute (EEI), a utility trade group.


# IHiZAVTnrfIKOcc 2015/02/24 23:31 Rosendo
How many would you like? http://www.wisconsinplanners.org/requestsforproposals.html propranolol buy no prescription But although the scope of the Horniman is remarkable, greatness does not demand extensiveness. The Brixham Museum – which is too small to even have a café – succeeds because it is a place with a heart. “They have clearly spent a lot of time thinking about how to engage families of different generations and children of different ages,” says Tina. “Things that are very precious are kept well away from little hands, but there is plenty to touch and the atmosphere makes children want to get involved with things, rather than keep quiet.”


# sjYQVnQIHE 2015/02/24 23:31 Raymond
I work for myself http://www.streamsweden.com/konsulttjanster/ propranolol sa 80 mg cap myl China now burns 3.8 billion tons of coal each year, nearly as much as the rest of the world combined. China's CO2 emissions rose by 720 million tons in 2011 � a 9.3% increase. Scientists have found pollution and dust generated in China has been found settling in places as far away as California.


# DfokWnrvNuscjzRFYv 2015/02/26 2:39 Nicholas
Will I get paid for overtime? http://martinimandate.com/tag/sherry/ gabapentin 800mg tablets Boeing said it was aware of the fire and that had people onthe ground working to understand the causes of it. The U.S.Federal Aviation Administration said it was aware of the fireand was in contact with Boeing.


# MXlxrsMqXHEEkBksnVt 2015/02/28 16:40 Danielle
It's funny goodluck http://www.muruniiduk.ee/products Tricor 145mg While being a contributing factor to climate change, previous studies had considered how the emissions could create conditions that exacerbated poor air quality, such as the way an increased concentration of chemicals interacted with sunlight.


# xoCNdvumZNxBmWdCDKa 2015/02/28 16:41 Jefferey
Where do you come from? http://zoombait.com/z-hog/ Levonorgestrel Cost CAIRO (AP) � Egypt's highest security body warned Sunday that the clock is ticking in the search for a peaceful end to the standoff over sit-ins by ousted President Mohammed Morsi's supporters, suggesting that authorities will break up the vigils unless ongoing mediation efforts produce results soon.


# igECTHZIeJWMg 2015/02/28 16:41 Winfred
I'd like to cancel a cheque http://version22.com/about/ xalatan dosage for dogs Under that 2011 deal, Xstrata used infrastructure at its Fraser mine to dig mostly copper ore from a deposit of Vale ore bodies accessible from Xstrata's mine - a project with a 10-year life that also increased fresh air ventilation, benefiting working conditions for Vale's employees.


# FJMiAMKelna 2015/02/28 16:41 Incomeppc
I've only just arrived http://www.bethelhebrew.org/about-us Purchase Cardura U.S. crude prices rose 0.3 percent to just below $101a barrel after having fallen to their lowest level in more thanthree months in the previous session as stockpiles at oil hubCushing began to reverse a months-long decline, and as signs ofprogress in talks over Iran's nuclear programme also pressuredprices.


# TKGyxIEDAbusGgVBntT 2015/02/28 16:41 Clint
I'm on business http://version22.com/about/ xalatan generic australia There is some truth in all these explanations. While the credit crunch did trigger the crisis, it exposed a host of problems that had been masked by a decade of easy growth. Peripheral countries had grown uncompetitive as a result of rising wages. Often there was corruption and excessive debt, while anti-competitive practices that suited vested interests kept productivity low. Almost everywhere, governments ran unsustainably generous welfare states.


# PmtoVnKwUTbg 2015/04/08 7:23 Alex
The United States http://www.sandiegowebworks.com/quote.shtml where to buy ventolin inhalers The bell from the wheelchair of series villain Hector "Tio" Salamanca went for $26,750, and the jewel-capped grill worn by his nephew Tuco brought in $20,250. Another winning bidder paid $23,250 for a pink stuffed teddy bear last seen falling into White's swimming pool after a plane crash, beating out 63 other fans.


# Salt Lake lawn care 2016/05/23 1:28 One Man and a Mower @@SaltLake.org
One Man and a Mower lawn care provides the best service for your lawn in Salt Lake City, Utah. One Man and a Mower lawncare is saves you more than most other services and gives better service.

# comment3, http://data-recovery-software.bid/ restore data, 8-DDD, 2017/03/04 20:31 Xpqlitmd
comment3, http://data-recovery-software.bid/ restore data, 8-DDD,

# pcaughtf 2017/03/08 13:42 euFreWs
ihusbandf http://buy-provigil.bid
npossibleh http://clomid-rx.bid

# seyesq 2017/03/08 16:36 vdAlono
wmoreh http://buy-provigil.bid
xeveningy http://buy-provigil.bid

# Hello http://antibioticanada.com keflex online 2017/03/20 14:03 amoxil canada
Hello http://antibioticanada.com keflex online

# エルメス財布コピー 2017/10/27 15:41 zzlmsvwt@live.jp
こんなに 早く 届けられるとは 思わなかったので とても 嬉しかったです 梱包も丁寧にされていて また 何か 探そうと 思います
シャネルリング♪送料無料 新品SAランクシャネル リング ココマーク カラーストーン シャンパンゴールド 約12号 00A 2000年モデル 新品 ラインストーン 艶消し マット ブラック グリーン クリア 150106041 (西) CHANEL COCO
普段使いには このぐらいの 価格が 丁度デスね 品物もとても可愛く 早速 使っています

# wxRnoTACsBoXD 2018/02/19 3:47 Barneyxcq
WKGZ6L http://www.LnAJ7K8QSpfMO2wQ8gO.com

# dZyNIcfRwOmPxRvB 2022/04/19 10:22 markus
http://imrdsoacha.gov.co/silvitra-120mg-qrms

# buy doxycycline online without prescription - https://doxycyclinesale.pro/# 2023/04/22 4:13 Doxycycline
buy doxycycline online without prescription - https://doxycyclinesale.pro/#

# prednisone without a prescription - https://prednisonesale.pro/# 2023/04/22 15:19 Prednisone
prednisone without a prescription - https://prednisonesale.pro/#

# buy cytotec in usa - https://cytotecsale.pro/# 2023/04/29 4:49 Cytotec
buy cytotec in usa - https://cytotecsale.pro/#

# new treatments for ed: https://edpills.pro/# 2023/05/16 3:29 EdPillsPro
new treatments for ed: https://edpills.pro/#

# prednisone online for sale https://prednisonepills.pro/# - prednisone cost 10mg 2023/06/05 5:26 Prednisone
prednisone online for sale https://prednisonepills.pro/# - prednisone cost 10mg

# herbal ed treatment https://edpill.pro/# - ed treatment pills 2023/06/27 14:43 EdPills
herbal ed treatment https://edpill.pro/# - ed treatment pills

# paxlovid pill https://paxlovid.pro/# - Paxlovid buy online 2023/07/03 4:09 Paxlovid
paxlovid pill https://paxlovid.pro/# - Paxlovid buy online

# paxlovid india https://paxlovid.store/
paxlovid buy 2023/07/13 21:50 Paxlovid
paxlovid india https://paxlovid.store/
paxlovid buy

# online ed medications https://edpills.ink/# - mens erection pills 2023/07/27 0:59 EdPills
online ed medications https://edpills.ink/# - mens erection pills

# ルイ ヴィトン iphone 2023/11/08 1:20 veestegzxmn@yahoo.co.jp
今回初めて取引きさせていただきました。電話やメールの対応は丁寧で良かったです。商品を購入した際の確認メールや商品発送のお知らせのメールがやや遅いように思いました。スタッフの方の対応が良かったので次の機会があれば利用したいと思います。
ルイ ヴィトン iphone https://www.bagtojapan.com/category/76/3-key=1.htm

Post Feedback

タイトル
名前
Url:
コメント