正規表現道場@2ch Part2
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/24 22:57ID:LrbVcl3Yこのスレは有用そうな正規表現を紹介したり、どう表現したらいいかわからないときに
質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。
リンクなどは>>2-5のあたりに。
0116nobodyさん
03/01/18 13:45ID:hA2YqZMs0118115
03/01/18 18:54ID:???>じゃあ、抽出後に<>を置き換える。
抽出後に<>を置き換えると、
<aまで<aに置き換わってしまうので・・・
>まとめて括弧でくくれば
そうですね。
で、一旦[link]http://www.yahoo.co.jp[/link]に置き換えてから、
<>を置き換えて、[link]...[/link]を置き換えるというもの考えたんですが、
それだと
=~/\[link\](.*)\[\/link\]/\<a href=\"$1\">$1\<\/a\>/g;
等としても、最初の[link]から最後の[/link]までが置き換わってしまって、
2つlinkが続く場合等に予期しない結果になってしまいます。
0120115
03/01/18 19:23ID:hA2YqZMs表示時にタグ付けすると解決する?
0122115
03/01/18 19:33ID:???<a href="http://www.yahoo.co.jp/&quot;>Yahoo</>
とかになるわけで・・・
0123nobodyさん
03/01/18 19:38ID:???なんでやねん。
データ:
http://www.2ch.netって死ぬほどおもしれー!
表示:
<a href="http://www.2ch.net">http://www.2ch.net</a>って死ぬほどおもしれー!
0124115
03/01/18 19:47ID:???<a href="http://www.yahoo.co.jp/">Yahoo!</a>
と投稿した場合。
char str[]="http://www.yahoo.co.jp/";
等でも同じ。(この場合はco.jpの後の"もリンク扱いされてしまう)
0127nobodyさん
03/01/20 08:07ID:vz/F/uwh一番エレガントな書き方ってどういうのですか?あと
$url = 'http://www.2ch.net/';
$url =~ s/2ch/1ch/;
と書いた場合になんで$url のなかの"/"をエスケープしなくても
エラーにならないんでしょうか?
0129nobodyさん
03/01/20 08:09ID:???http\/\/:(www\.)?2ch\.net\/
0131nobodyさん
03/01/20 19:22ID:gSzazTgePerlだと、こう書く。
m#^http//:(?:www\.)?2ch\.net/$#
完全一致だよね。知らないけど。
あと、DNSは大文字小文字を区別しないから、この書き方は間違ってる。
今の場合は、単に正規表現を聞いてるんだから、/をエスケープする必要は無いし、
それに、Perlで使うときも、いちいち/をエスケープするのは、エレガントじゃない。
0132nobodyさん
03/01/20 20:43ID:vz/F/uwhでも、なんで
s/http://www\.2ch\.net/http://www\.1ch\.net/;
がエラーで
$url = 'http://www\.2ch\.net/';
$b = 'http://www\.1ch\.net/';
$url =~ s/$url/$b/;
がokなんでしょうか?
そのへんの理屈がよく分かりません
0133nobodyさん
03/01/20 21:52ID:gSzazTgeから、インタプリタはs/ / /を認識できる。
0134nobodyさん
03/01/20 22:08ID:???s///による置換を行う前に、s///の構文チェックをしているからでしょう多分きっと。
s/http://www\.2ch\.net/http://www\.1ch\.net/;
sの次に/があるので/を区切りとした構文としてチェックしてみる。
3つ目の/以降はスイッチ部。
wwwというスイッチは存在しないので、エラー出力
(Bareword found where operator expected, near "s/http://www")
s/$url/$b/;
構文としてはs///という形になるのでOKなので、
次に、正規表現の文字列となる$urlを正規表現のスタック?に展開して積み込み、
同じく$bを展開部用のスタックに積み込んでいるのではなかろうか。
あくまでも想像。
0135nobodyさん
03/01/22 11:39ID:Lm4zDQtU/(^.*key.*$)/$1/
じゃダメポ。
というのも、とあるテキスト書換えソフトでgrep出来たらいいなと。
0137nobodyさん
03/01/22 11:44ID:???foreach(@hoge)
{
if(/^.*key.*$/)
{
push(@a,$_);
}
}
で、良いじゃん。正規表現が合ってるかはは知らんけれど
0138nobodyさん
03/01/22 12:04ID:Lm4zDQtUgrepが使えたらこんな事はしないかと。
>>137
if等は使えないんですよ。
つまりエディタの検索、置換えに指定する事でgrepするようなものです。
0140nobodyさん
03/01/22 14:10ID:Lm4zDQtU例えですけど、メモ帳の置換えでif使えますか?
マクロじゃないですので使えないです。
0144nobodyさん
03/01/22 15:59ID:???0145nobodyさん
03/01/22 16:47ID:Lm4zDQtU何か大きく勘違いなされてるようで。
とにかく、1行(s/find/rep/)の構文だけでgrepと同じ事を出来ないかと言う事です。
スクリプトを組めるなら最初からそうしますが
制約上そのような事ができません。
0147nobodyさん
03/01/22 17:30ID:Lm4zDQtUどういう事でしょうか?
0148nobodyさん
03/01/22 17:36ID:???はじめから落ち着いて、
・一体どんなアプリケーションを作っているのか。
・一体そのアプリケーションのどの処理で悩んでいるのか。
・ifが使えない制限とは?
位は書いてくれい。
0149nobodyさん
03/01/22 17:56ID:Lm4zDQtU・使ってるソフト。
よくあるファイル一括書換えソフト。
・やりたい事
メモ帳の置換え(CTRL+H)のような感じで
検索する文字と置換えする文字を指定する事で
ファイルの内容を一気に高速で書き換えられる。
検索文字列及び置換え文字列はBREGEXP.DLLを使う事で
Perlと同等の置換えが指定できる。
その検索文字列と置換え文字列の指定方法。
・IFが使えない理由。
メモ帳のように検索文字と置換え文字を指定する事しか出来ない為。
ソフトを作ってる訳ではなく使っているだけ。
です。以上で分かって頂けるでしょうか?
0151nobodyさん
03/01/22 18:06ID:Lm4zDQtU何故無理と言い切れるのでしょうか?
0152nobodyさん
03/01/22 18:18ID:???0153nobodyさん
03/01/22 22:05ID:NkPjRdCp正規表現は、置換にも使えると聞き、検索っていうとこで、正規表現をオンにして、
自慢のコードをつっこんでみたが、ちゃんと動かないので、調べるのは面倒だから、
2chに書き込んでみた。でどうだ。
で、さらに、正規表現∈Perlだと思っている。と。
キボンヌって言えば仲間になるから大丈夫だと思っていたら大間違いだぞ。
0158nobodyさん
03/01/28 00:31ID:2+2ZA9Prif($ENV{'REMOTE_HOST'}=~/crawl[\d]+\.googlebot\.com/){⊥}
でいいのけ?
0159nobodyさん
03/01/28 00:52ID:???$robots = "crawl4.googlebot.com";
if($robots =~ /crawl[\d]+\.googlebot\.com/ ){ print "kita----!!";}
をローカル環境でテストしてみる。
0160nobodyさん
03/01/28 16:58ID:Go6r3Mozそれから、後方一致で調べればいい。
↓普通はこう。googlebotドメインだったらいいんでしょ?
$ENV{REMOTE_HOST} =~ /\.googlebot\.com$/i
↓\dを使うなら、こう使う。\d = [0-9]なので
$ENV{REMOTE_HOST} =~ /crawl\d+\.googlebot\.com$/i
0161nobodyさん
03/01/29 11:03ID:aizQjUQ4$salt =~ s/[^\.-z]/\./go;
の [^\.-z] これって、具体的にはどれを表すんですか?
0162nobodyさん
03/01/29 13:00ID:w0j+LU9j./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
↑以外
0165nobodyさん
03/01/29 21:40ID:aizQjUQ4ありがとん。
0166nobodyさん
03/01/29 21:45ID:Jsuq0iRwで、$word に「エロ」を入れてやると、「トロ」という言葉にもマッチするんですが、
何故でしょうか?
0167nobodyさん
03/01/29 22:08ID:???最後の i のせい。
「エ」の2バイト目は "G"
「ト」の2バイト目は "g"
i をつけると大文字小文字を区別しなくなるので、この2つがマッチする。。
0168nobodyさん
03/01/29 22:11ID:???http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
ここを読んでおけ
0169nobodyさん
03/01/29 23:18ID:???( ´_ゝ`)フーン
能無し君がまだ初心者相手に威張る為ここに居たんですか。
まぁ分からない事聞かれて逆切れしてるような貴方にはここがお似合いですね。
( ´,_ゝ`)プッ
0171質問者
03/02/02 12:33ID:aPQL5QO2一回の検索で、マッチした文字列がどの条件にあたるかを知ることが出来る?
たとえば
対象文字列: abcdefg
検索語彙: (ab)|(fg)
こういうとき、"ab"と"fg"がマッチするということはわかるが
マッチした文字列がそれぞれどの条件だったのかを知りたい。
BREGEXP(Perl5)もしくはVBRegularExpressionで。
一回の検索では無理?
0173質問者
03/02/02 12:39ID:aPQL5QO2実はプログラム技術板から来た。
正規表現スレがあるのはこの板だけっぽい。
マッチ文字列を取得することは可能なのだが、
何にマッチしたのかを確かめるためにはどうすれば‥‥?
0174nobodyさん
03/02/02 12:42ID:???つぅか誘導したのはこの俺だ。
マッチさせたい文字列は自明(自分で設定したんだからな)なのだから後はifとeqで比較すればどうだ?
0175質問者
03/02/02 17:45ID:aPQL5QO2そか、どうも。
マッチした文字列を検索文字列と比較するということ?
>>171で書いた例についていえばそのとおりだが
正規表現でマッチさせたものについて知りたいので
単純にifで比較してもしょーがない。
(検索文字列が"a."などのとき、比較してもしょうがない)
かといって正規表現でテストするってのも二度手間だし。
正規表現でうまく書けば出来るとか、
普通そーゆー機能あるよ、とかいうことはないですかー?
0176nobodyさん
03/02/02 17:47ID:???$x =~ /(ab)|(cd)/;
if($1 eq "ab")
{
print("ab");
}
0177nobodyさん
03/02/02 17:56ID:???なるべく別々に処理を行うようにするけど。
VBとかの機能はマ板で訊いてください。
0179質問者
03/02/02 18:20ID:???ありがと。
もしかして知らないところで世の中便利になってて
一撃で出来るかなーと思ったのですが。
とりあえずあきらめときます。
0182nobodyさん
03/02/14 01:16ID:???0183nobodyさん
03/02/17 07:11ID:tFA1sH7Sという文字列を split して
[ 'hoge', 'piyo', 'foo\/bar', baka ]
という配列を得たいのですが、/ で split するけど \/ では split しない
ってのはどう表せますか?
0184nobodyさん
03/02/17 08:04ID:???0185nobodyさん
03/02/17 10:03ID:???バックスラッシュを一般化して使いたい場合を考えると split するより
my $path ='/hoge/piyo/foo\\/bar/baka/';
my @nodes;
foreach my $elem ( $path =~m%(?:^|\G/)((?:\\.|[^/])+)%g ){
$elem =~s/\\(.)/$1/g; # バックスラッシュを取り除く場合。
push( @nodes, $elem );
}
みたいなのの方がいいと思う。
これだと
/hoge/piyo/foo\/bar\\/baka/ => ['hoge','piyo','foo/bar\','baka']
みたいなのにも対応出来るし。
s///g 使って無理矢理1ステートメントにするのもアリか。
0186183
03/02/17 11:44ID:???0187nobodyたん
03/02/18 01:11ID:???@hoge = split m[(?<!\\)/], $path;
0188nobodyさん
03/02/18 18:45ID:???while ($value =~ /(<strong>.*?)<\/p><p>(.*?<\/strong>)/)
{
$value =~ s/(<strong>.*?)<\/p><p>(.*?<\/strong>)/\1\2/g;
}
※ $value に HTML が入っている。
初めはこれでも問題なかったんですけど、例えば、
$value = "<p><strong>あ</strong></p><p><strong>い</strong></p><p><strong>う</strong>";
のとき、置換後の $value は、
$value = "<p><strong>あ</strong><strong>い</strong><strong>う</strong>";
となってしまいます。この書き方で大丈夫だと思っていたのに、どうなってるんでしょうか・・・
0189nobodyさん
03/02/18 18:57ID:???<strong>.*?</p><p>.*?</strong> だと、
<strong> => <strong>
あ</strong> => .*?
</p><p> => </p><p>
<strong>い => .*?
</strong> => </strong>
ってマッチしちゃうよ。
$value =~s{<strong>(.*?)</strong>}{
my $tmp =$1;
$tmp =~s|</p><p>||g;
"<strong>$tmp</strong>";
}ge;
とか。もっと良いやり方ありそうだけど。
0190188
03/02/18 19:13ID:???あまりの睡魔に襲われて、今 コタツで寝ながら考えていたのですが、私の書き方だと strong 要素内に </p><p> がない場合を考えてないわけですよね。
本当に申し訳ございません・・・
>>189
有り難うございます。
教えて頂いた方法ですが、あとで勉強しながら考えてみます。
どうも私ではすぐには理解できそうにないもので。
とにかく有り難うございました。
0191nobodyさん
03/02/18 20:27ID:???0192nobodyさん
03/02/18 23:46ID:oZOSGD0m正規表現を勉強し始めた理由は、以下の質問からです。
192.168.1.8が、192.168.1.0/24 のネットワークアドレスに含まれているかどうかを
判定する正規表現を書くことは可能でしょうか。
よろしくおながいします。
0193nobodyさん
03/02/18 23:48ID:???0194nobodyさん
03/02/18 23:50ID:???ならtrueなのは自明だけど。
0195192
03/02/19 00:13ID:bka3cebnありがとうございます。やっぱし、正規表現よりは普通にプログラムで
やったほうが良いですか、、ちなにみJava使いです。んー、書いたことないので
なやみます。
0197nobodyさん
03/02/19 00:59ID:???0198nobodyさん
03/02/19 01:00ID:???0199nobodyさん
03/02/19 01:21ID:???0200192
03/02/19 02:16ID:bka3cebnええ、あれ、なんか、無視しちゃうような悪いことしちゃいましたか?
すいません、何かサンプル教えて下さるとうれしいす。。。
0201nobodyさん
03/02/19 02:23ID:???0202nobodyさん
03/02/19 16:59ID:oL6d+rQlという文字列があり、
name = 'hoge's name'の、内側の'だけをエスケープして置換えたいのです。
つまり
select * from testtable where name = 'hoge\'s name';
としたいのです。
ただし外側の'は必要ですのでエスケープしたくないのです。
込み入った例を書くと文字列が
name = ''''' and value = '''' の場合は、
name = '\'\'\'' and value = '\'\''
にしたいのですが、このような複雑な処理を正規表現で行うのは無理なのでしょうか?
0204nobodyさん
03/02/19 17:45ID:???> 込み入った例を書くと文字列が
> name = ''''' and value = '''' の場合は、
最大マッチでも難しそう・・・
0205nobodyさん
03/02/19 18:15ID:???SQL だと 文字リテラルのでてくる場所たくさんあるから
個数限定ってわけにもいかないし。
対になってるわけでもないし。
'' ' ' '' ' ' ' '
こんな文字列からクオートすべきのを見つけろ、ってのとかわらんもん。
どういう案件かはわかんないけど、
SQL に置き換える段階でクオートしなかったのが敗因ですね…
0206nobodyさん
03/02/21 12:55ID:6n4aSTAx了解です。
楽しようとせずSQL文を完成する前に
ひとつずつ置換えるようにします。
どうもでした。
0208nobodyさん
03/02/21 15:37ID:???0209nobodyさん
03/02/21 22:45ID:Kv1GvIlPそのなかに | があっても大丈夫ですか?
/(2ch\.net|1ch\.(com|org))/
みたいな・・
0211nobodyさん
03/02/21 23:19ID:???えっと・・あとどれをエスケープするんでしょうか?
この場合合致させたいのは
2ch.net
1ch.com
1ch.org
です
0213nobodyさん
03/02/22 10:01ID:???0214nobodyさん
03/02/22 10:12ID:???聞いた方がはやいやーってなっちゃうだろうね。
■ このスレッドは過去ログ倉庫に格納されています