重複です。速やかに削除してください。 つーか1誌ね
さすがにこっちが本家だな。何が重複だか。バカじゃねーの?
こんなことで喧嘩するなwww
9 :
デフォルトの名無しさん :2005/11/04(金) 02:48:53
n
10 :
デフォルトの名無しさん :2005/11/04(金) 13:53:13
0〜255までの数字を正規表現でどう表せばよいですか?
>>10 数字が 0 と正の整数だとして。
・(0|1|2|3ry
・([0-9]|[1-9][0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))
・0 <= x && x <= 255
12 :
10 :2005/11/04(金) 15:47:07
>>11 (2([0-4][0-9]|5[0-5])|1[0-9][0-9]|[1-9][0-9]|[0-9])
というように逆にしないとうまくいかないようです。
それは置いとくとして、これだと
2560 がヒットしてしまうのですよ
>>10 言語は? Perl なら (?:1\d?\d?|2(?:5[0-5]?|[0-4]?\d?)|[3-9]\d?|0)
14 :
10 :2005/11/04(金) 16:20:22
>>13 言語は何でもいいよ。phpでも秀丸マクロでも。
逆にいえば、どの言語でもそこそこ動くよう
一般的?なパターン構文のみを使った
正規表現がいいな
>>12 頭と尻に[^0-9]付ければ良いだけちゃうの?
>>10 てか、正規表現でなければならない理由は何?
>>11 の最後が一番話が早いと思うが。
ipアドレスの正規表現なら前にあったような
18 :
10 :2005/11/04(金) 17:44:44
>>16 >正規表現でなければならない理由は何?
なぜなら、ここが正規表現スレだから。
必要とか不必要とか、そんなこというなよ。ロマンチックじゃないぜ。
20 :
10 :2005/11/04(金) 18:20:27
>>19 あ?お前偉そうだな。
その調子なら他所でもやっていける。
お前こそこのスレからでてってくれ。
俺にこそこのスレは相応しい。
23 :
10 :2005/11/04(金) 21:11:32
>>19 スレ違いと言われても・・・
こういう正規表現って他にも応用は効くと思うよ。
>>15 のがいけると思ったけど、2560などを「マッチングさせない」ようにはできなかった。
^((2([0-4][0-9]|5[0-5]))|(1?[0-9]?[0-9]))$
入力が単語ならこれでいけた。サブパターンがいっぱい出来てうっとおしいけど
C#C#C#〜!
全てのシングルバイト文字にマッチさせるときは [\x0-\xff]って書くんですか?
.は改行にはマッチしないでしょ
>>27 sedやawkなら.は改行にもマッチしますよ。探索空間が通常行単位なので、
行末の自然な改行とマッチしないように見えるだけでしょう。
sedならNなどで、awkなら変数に陽に改行を代入するなどしてお試しください。。
perlもマッチ演算子にsなどのoptionをつければ.が改行にもマッチします。
これも仕様をよくみると、普段は改行にマッチさせないというよりむしろ、
普段は探索空間を行単位にしていることからくると解釈すべきでしょう。
正規表現勉強中なのですが・・・ ソースの解析のように読み進んでって"if"来たから"ifルーチン"処理モードに入ってとか"void"来たからメソッド処理モードに入ってとかやるのは苦手?
>>29 無理すね。
そういう用途じゃないから。
正規表現は、あるクラスの文字列の集合(言語)を表現してるだけですから。
(で、たいていはパターンマッチに使う。)
ツール(sedなりperlなりlexなり)がそういうこと
>>29 やるために
正規表現を使うというstoryでしょう。
31 :
29 :2005/11/24(木) 14:07:14
>>30 > ツール(sedなりperlなりlexなり)がそういうこと
>>29 やるために
> 正規表現を使うというstoryでしょう。
この場合、正規表現使うというのはどういう使い方なんでしょ?
たとえばifロジックの中の判断ルーチン部分が式の形になってるかどうかをチェックするために使うとか?
>>31 それは構文解析器って奴の仕事だね。yaccとかbisonとか。
正規表現はその前の字句解析に使うね。lexとかflexとか。
字句解析で正規表現をどう使うかはググってもらったほうがわかりやすい解説があると思う。
33 :
32 :2005/11/24(木) 18:40:12
あ、yaccとかbisonとかって言うのは構文解析を行うものじゃなくて構文解析器を生成するためのツールね。 で、lexとかflexは字句解析器を生成するためのツール。
34 :
29 :2005/11/24(木) 19:26:30
>>32 ,
>>33 感謝。
lex/yacc自体の存在は知ってるんですが、自分のプログラム(C#)にどう生かすか、わかってません(´・ω・`)
いろいろ見てみます。
yaccの作者って、今ははなまるマーケットにレギュラー出演してるんだっけ
やっくんすげー
ここで Yet Another Compiler Compiler という全員が知っているようなマジレスをして 叩かれるのを待ってみるw
ここで ヤクの亜流だからバイソンという洒落で名前がついたと言う 嘘かホントか判らん事を書いて叩かれるのを待ってみる♪
正規表現は、やはりMかもしれない。
正規表現の$~って具体的にはどんなデータが入ってるの? $&はパターンマッチした文字列が入っているので直感的にわかりやすいんだけど
>>44 適当な例で実行して結果を表示するとか試せばすぐわかるじゃん。
それと、一応、$~みたいなあまり普遍的でないものに言及するなら、
数ある正規表現の中のどの実装(仕様)のことなのか明記してくれ。
46 :
デフォルトの名無しさん :2005/12/11(日) 08:14:23
Windowsで正規表現にマッチする文字列のみ(行全体じゃなく)を表示・保存するにはどうすればいいのでしょうか? xyzzyとかのエディタのgrepでやろうとしたのですが、検索してもよくわかりません。 Rubyとかスクリプト言語を使わないと無理でしょうか?
秀丸でさえできるし、yzzyでできないわけがない。
xyzzyでできないわけがない。
49 :
デフォルトの名無しさん :2005/12/11(日) 11:03:46
どうやるの?
おまえ一々うんこの仕方考えながらするのか?
51 :
デフォルトの名無しさん :2005/12/11(日) 11:31:43
普通にgrepすると余計なのまで出ちゃう。マッチする文字列だけでいいの。
54 :
デフォルトの名無しさん :2005/12/15(木) 18:36:48
半角スペースと全角スペースのみで構成されてるデータを さがす正規表現って、下記でよいでしょうか。 ^(\s| )*$ 既出でしたらすいません。
\sはタブも含むし半角と全角スペースが混じっている行にはマッチしないよ
*だと^$にもマッチする悪寒♪@空文字列
57 :
54 :2005/12/15(木) 22:25:58
^[\s ]*$ ↑全角スペース ですかね? とある入力項目のなかで、 \s と全角スペースで構成された、いわゆる”空行”を はじきたいのです。
だからそれだと ^$ → 空行 にもマッチするので、 ^(\s| )+$ なのではないかと。。。
59 :
デフォルトの名無しさん :2005/12/16(金) 11:52:47
>>58 有難うございます。
入力フォームで、ようするに何も入力しない場合や、
スペースのみの場合を弾きたかったので、
^$ → 空行 でマッチしてもOKでした。
^[\s ]*$ ならば、未入力のケースと
スペースのみの場合、両方マッチできました。
60 :
デフォルトの名無しさん :2005/12/19(月) 13:56:19
************************ xx<tag val="xxx">xxx</tag> ************************ こんな文字列があったとして <>で囲まれている部分のみをマッチングするのは <.+?> ですが、その逆の囲まれていない部分のみをマッチングするには どうしたらいいでしょうか。
>>60 これじゃいかんの?
~$ perl -e '$var="xx<tag val=\"xxx\">xxx<\/tag>"; $var=~s/<.+?>//g); print "$var\n";'
xxxxx
62 :
60 :2005/12/19(月) 14:32:26
マッチングさせるだけでなくreplaceが必要なのです。
63 :
60 :2005/12/19(月) 14:36:17
連投すみません ************************ xx<tag val="xxx">xxx</tag> ************************ の<>で囲まれた部分は維持したまま 囲まれていない部分をreplaceする必要があるのです。
それじゃ sed -e 's/[^<]*</置き換えたいもの</ -e 's/[^<]*/置き換えたいもの/' みたいな感じでは?
情報小出しの典型的な教えてクン
66 :
60 :2005/12/19(月) 14:50:54
ありがとうございます。 しかし、たとえば ************************ xxx<tag val="xxx">xxx_xxx</tag> ************************ の<>で囲まれていない"xxx" を"yyy"にreplaceしようとすると ************************ yyy<tag val="xxx">xxx_yyy</tag> ************************ となってしまいます。
正規表現の勉強をしようと思って、初めてこのスレを見たけど、 自分が買った本に、”0〜255”の正規表現が載っていたYO。 [0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]
68 :
デフォルトの名無しさん :2005/12/19(月) 16:02:14
>>60 一般的に「ほげほげでない」条件の正規表現はめんどくさいのだが、今回の場合は
文字列の先頭または「>」 と 「<」または文字列の最後 にはさまれた部分と
考えれば簡単だ。
Perlメモにそのものずばりがあったよ。
http://www.din.or.jp/%7Eohzaki/regex.htm#ReplaceOutside O崎さんすら3度も書き換えてる!むずいんだ。
~$ perl -e '$var="xx<tag val1=\"xxx\">xxx<\/tag>xx<tag val2=\"xxx\">xxx<\/tag>xx"; $var =~ s/(?:^|(?<=>))(.*?)(?:$|(?=<))/yyy/g; print $var, "\n";'
yyy<tag val1="xxx">yyy</tag>yyy<tag val2="xxx">yyy</tag>yyy
いけね、古いほう張っちゃった。これだとタグから始まる場合、まずい。 だけど 2002/10/21 「タグの外側だけ対象に置換する」スクリプトと文章追加 の最後に書いてある解決法、理解できん。
>>69 正規表現 マッチしない でぐぐったらそんなの簡単に見つかるわけだし
まさかぐぐりもしないで質問したんだろうか?
>>71 検索がお上手ですね
、とでもいってほしいのか?
下手といわれるよりはマシだろ
74 :
60 :2005/12/20(火) 10:08:26
>>69 ありがとうございます。
PHPで \G が使えないのでそのへんのロジックは
自分で書くしかないかなと思ってます。
質問小出し作戦
76 :
60 :2005/12/20(火) 12:12:14
おかげで解決できました。 以下のようにしました。 <?php $str = 'xxx1<tag val="xxx2">xxx3</tag><tag val="xxx4">xxx5_xxx6</tag>xxx7'; $search = 'xxx'; $replace = 'yyy'; $search = '([^<]*)'.$search; $replace = '$1'.$replace; $str = preg_replace ('/'.$search.'/',$replace,$str); while ( preg_match('/>'.$search.'/',$str) ) { $str = preg_replace ('/>'.$search.'/','>'.$replace,$str); } echo $str; /* output yyy1<tag val="xxx2">yyy3</tag><tag val="xxx4">yyy5_yyy6</tag>yyy7 */ ?>
正規表現で閉じなくてコードを書いてもいい普通のプログラミングの話 だったなら、最初からスクリプトのスレに行けばいいじゃんかよ...
だから情報を小出しにするやつの相手しちゃダメなんだって
コードを書いてもいい、んじゃなくて 正規表現だけじゃ解決できなかったっていう話しですよ。 内容ちゃんと理解してからレスしてね。 粘着質な自治厨さん。
80 :
77 :2005/12/21(水) 03:41:09
「行けばいいじゃんか」って書き方が気に障ったのならスマンな。 「行ったら楽だったのでは」と読み替えてくれ。 ある問題につきあたったとき、それをなぜ正規表現の範囲で解決しなければ ならないと考える人が多いのか、不思議なんだよ。悪い意味のコダワリなのでは。 実際、最初に問題が提示されてから解決まで丸1日もかかっていますよ。 それから「閉じている」というのは普及した技術用語で、ある技術や問題が特定の 範囲に囲い込まれている or 「〜だけで解決や表現できる」ことを意味します。
>>80 ここが正規表現スレだからだろ
ご飯の炊き方スレでパンの焼き方解説してどうするんだよ
どのていどの妥当性をもって良しとするか前提がない 正規表現を記述しようと試みるのは愚の骨頂といえよう
初心者のうちは文字列処理=正規表現だからしょうがないとも言える
ということで
>>85 が正規表現の範囲で解決してくれるそうです。
87 :
デフォルトの名無しさん :2005/12/24(土) 04:34:20
「2aa」や「5aaaaa」といった文字列,つまり最初に数字があってそのあとにその数字の数だけ「a」が続くという文字列を正規表現であらわすにはどうすればよいでしょうか。(\d+)a{\1}という記述では拾えませんでした。。
>>87 無理。
'2'を数の2にevaluateする仕組みが必ずどこかに必要。
桁数が有限なら自明な和(正規表現の|)で実現できるけど、実用にはならない。
>>87-88 まぁその evaluate する仕組みなわけだが、Perl なら
print "$_ : ", /^(\d+)(??{"a{$1}"})\z/ ? 'match' : 'unmatch', ".\n"
for '2aa', '5aaaaa', '7aaa', '11aaaaaaaaaaa', 'aaaaa';
90 :
87 :2005/12/24(土) 18:59:20
93 :
91 :2005/12/24(土) 23:20:14
\1 に渡す方法について教えて下さい A) <a href="mailto:xxxxx">作者名</a> B) 作者名 AとBの2パターンがあったとして、どちらにもマッチする方法で「作者名」だけを \1 に渡すにはどうしたらよいでしょうか? ^.*>(.*)<.*$ や ^[.*>|.*](.*)[.*<|.*]$ などとしているのですが、どうにも絞り込めません。
>>95 とりあえず純粋正規表現(?)のみじゃね?
言語のパワーを借りないと無理っぽいけど
つーか、この仕様の書き方だと
C) <a href="
http://xxxx ">作者名</a>
のときは 『<a href="
http://xxxx ">作者名</a>』 が
作者名になるな。うん。
つーかHTMLパーサのスレってなかったっけ? XMLのスレには含めたくないみたい。
// C# string text = "<a href=\"mailto:xxxxx\">作者名</a>\r\n作者名"; Regex re = new Regex("(^.*>(?<name>.+)<.*$)|(^(?<name>.+)$)", RegexOptions.MultiLine); foreach(Match m in re.Matches(text)){ Console.WriteLine(m.Groups["name"].Value); }
#Perl 5.8 $_ = 'jvmv log:99jikvdglog:100bmvkllog:200'; s/.*log:(\d+).*/$1/; print $_; これだと最長一致してしまうので、200が表示されます。 s/.*log:(\d+)?.*/$1/; としてみましたがだめでした。 最初の 99 を取るにはどうしたら良いのでしょうか?
s/.*log:(\d+)\D*/$1/
s/.*?log:(\d+).*/$1/;
102 :
99 :2006/01/19(木) 19:15:12
>>101 なるほど!!
なんで気が付かなかったかな、・・・
秀丸の正規表現を使って 先頭に#のついたコメント行と空白行以外を 正規表現でgrepしてマッチさせたいのですが 除外したいものだけの検索は ^[ |\t]*[#|\n] で出来たのですが、それを否定した行を マッチさせるにはどうしたらいいでしょうか?
一般にある正規表現にマッチしない文字列にマッチする正規表現を 求めるのは難しい。たいてい正規表現にマッチするものに対して なんかする機能とマッチしないものに対してなんかやる機能は対に なってるものだが秀丸にはないんですかね? たとえばgrepだと-vフラグでマッチしない行の表示になるし、viだと g//〜とv//〜があるわけですが。
秀ちゃんではムリですか メンドーだけど ^[ |\t]*[a-zA-Z0-9記号羅列・・・・(#以外)] でやってしまいます。
108 :
デフォルトの名無しさん :2006/01/26(木) 15:52:32
正規表現は規格統一されてないのですか?
うん。
110 :
デフォルトの名無しさん :2006/01/26(木) 16:30:09
イケない事だと思いませんか?
ううん。
イけてないことだとは思います。
性器が個人差あるようなもんさ
ゼロの者での表現はあんまり好きじゃない
昔は好きだったんだけどな。
116 :
デフォルトの名無しさん :2006/01/27(金) 10:07:21
正規なのに亜種だらけとはこれ如何に?
規格と言えるほどのものというと ・POSIX ・XML Schema ぐらいかねえ。あとはプログラミング言語やツール依存。
ECMAScriptの仕様書に、正規表現の部があったような。
「規格」はあれど、「規格統一」は無し・・・
POSIXが不遇なのはPerl互換のせいだな。 デフォで最長一致にならんのが普通って状況。
宗教か
オレはつつみあかり教だな
文頭・文末に任意に存在する/を取りたいのですが、 文末の/が.*に吸収されてしまいます。 これを改善する方法は無いでしょうか? 値の例:(aaは任意の値で、/を含むことがある) aa /aa aa/ /aa/ 作ってみた表現:(PHP) preg_replace("/^\/?(.*)\/?$/", "\\1", $str); 結果: /aa -> aa /aa/ -> aa/
124 :
123 :2006/01/29(日) 21:52:12
続報です。 preg_replace("/^\/?(.*?)\/?$/", "\\1", $str); で、何故か大丈夫でした。 理屈が分かりませんが・・・
ecmascriptなら str.replace(/^\/|\/$/g, "") か str.replace(/^\/?(.*?)\/?$/, "$1") でうまくいった。
解が複数ある場合、どれが選ばれるかという決まりは特にない。 ましてPerl互換のエンジンの場合は全ての解を求めない。
で?
/((それ)?で|だから(なに)?)\?/ とか言うやつは卑怯者
D:\>type sorededakaranani.js while (! WScript.StdIn.AtEndOfStream) { if (/((それ)?で|だから(なに)?)\?/.test(WScript.StdIn.ReadLine())) WScript.StdOut.WriteLine("卑怯者"); else WScript.StdOut.WriteLine("not 卑怯者"); } D:\>cscript //nologo sorededakaranani.js で? not 卑怯者 それで? not 卑怯者 だからなに? not 卑怯者 ^Z D:\>
>>130 ?が全角になってるから。
つまりもっと卑怯者
後出しジャンケンとかマジかっけーし
喧嘩してーなら河原行ってこい
\Aから始まって"で終わる文字列にマッチするにはどうしたらいいのでしょうか? "/\\A[^\"]*\"/i" にしてもマッチしませんですた PHPでつ
試してないけどエスケープが足りないんじゃないかな。 PCRE だよね? "/\\\\A[^\"]*\"/i"
ありゃ、知りませんですた。 基本のようですね、丁寧にありがとうございますた(;´Д`)
必要ないなら ' にしとくとまだマシ preg_ を " で書くと気が狂いそうになる
Emacs Lisp の正規表現よりマシ。
発言者「発言」 みたいなデータがあるとき、Rubyの正規表現で 発言者と発言を取り出すにはどうやればいいんでしょうか? (.+)「(.+)」$でやってみたのですが、無理だったので。
>>140 それでいけるはず。
ただ、文字コードが合ってないとまずいかも。
例えばマッチ対象文字列が EUC-JP なら /(.+)「(.+)」$/e みたいにする。
あるいは、 $KCODE = 'e' するとか、コマンドラインオプションで -Ke するとか。
>>141 文字コード、確かにEUCです。
早速やってみます。有難うございます。
143 :
デフォルトの名無しさん :2006/02/02(木) 17:24:11
h抜きURLの場合には先頭にhをつけてリンクするにはどうすればよいのでしょうか? 通常のhttp〜もリンクできるとなおいいです。
145 :
デフォルトの名無しさん :2006/02/04(土) 17:11:10
行頭のない行って存在しますか?
>>145 /^/はあらゆる行にマッチすると思います。
行頭だけの行って考え方もあるのか
て 存 っ 在 行 し い ま な す の か 行 頭
行頭が存在するためには何が必要なんだ?
行だ
諸君、行は行頭を必ず持つといえるだろうか?
行を「テキストエディタでカーソルが移動できる範囲」と定義すればありうるかも知れない。
154 :
デフォルトの名無しさん :2006/02/04(土) 23:24:08
エーテルが必要だな
光の速さになると行頭は存在しません。
絶対零速度に於いて行頭は2つ存在します。
行頭はサイコロを振らないと思う
行頭となるも午後となるなかれ。
不確定性原理により、行頭を見つけようとすればするほど、その位置はわからなくなる。
行頭は1日にして成らず
>>155 静止した観測者からそう見えるだけだな。
相対性の問題だ。
なんだこの行頭スレは。 ゲシュタルト行頭崩壊でも起こしたのか?
| …… | ('A`) / ̄ノ( ヘヘ ̄ ̄ ↑ 行末
行頭があれば行末もあるはずだよな
と、思うでしょ
167 :
デフォルトの名無しさん :2006/02/05(日) 15:14:31
同じ行に 「男」か「女」が順不同で含まれている行を検索するにはどう書けばいいの? たとえばこんなのを全部検索したい 「男と女の〜」 「その女が男の〜〜」
男.*女|女.*男
これなら行頭があって行末 の 無 い と 思 う の 文 う だ ろ が だ 、 う 実 ど は 際
神業的なリンケージリストの検出プログラム思い出した
ループ検出
それなんてアスキー出版局? たしかそれ。
>>170 どういうの?
後学のために教えてプリーズ
>>174 単方向リストで、片一方を一度に1個、
もう片一方を一度に2個進めて、
2個進めたほうがNULLにあたればループしていない。
逆に1個進めたほうと2個進めたほうが途中で同じ値になればループしているとか、
そんな感じだったと記憶している。
int isLoop(List*a){
List*b=a;
if(b)
while((b=b->next) != NULL && (b=b->next) != NULL && a!=b && (a=a->next)!=b){}
return b != NULL;
}
176 :
デフォルトの名無しさん :2006/02/07(火) 22:10:12
あんまりわかっていない者です。Javaでやっております。 かなり複雑な仕様で、ある文字列に次の文字がある場合に、 その文字を接頭語とする単語として区切ってStringの配列で返したいです。 # X \ \+ \- + - #123\+123 とあれば、#123と\+123の2単語に分けます。 また、文字列に半角スペースがあれば、 そのまま連続する半角スペースを文字列として返します。 もうあと少しなのですが、うまくいきません。 "TOP\+123+123 \-123-123\" という文字列がある場合に、 以下のようになってしまいます。 "TOP" "\" "+123" "+123" " " "\-123" "-123" "\"
177 :
デフォルトの名無しさん :2006/02/07(火) 22:11:45
本来であれば、以下なのですか。(\+がうまくいかないです。) "TOP" "\+123" "+123" " " "\-123" "-123" "\" どこを変えればよいのでしょうか?6時間やってますがダメです…
178 :
デフォルトの名無しさん :2006/02/07(火) 22:13:12
プログラム添付します。 String source = "TOP\\+123+123\\-123-123"; ArrayList list = new ArrayList(); Pattern p = Pattern.compile("(\\G[^X#\\+\\-\\\\ ]+)|(\\G\\\\-[^X#\\+\\-\\\\ ]*)|(\\G\\\\+[^X#\\+\\-\\\\ ]*)|(\\GX[^X#\\+\\-\\\\ ]*)|(\\G#[^X#\\+\\-\\\\ ]*)|(\\G\\+[^X#\\+\\-\\\\ ]*)|(\\G\\-[^X#\\+\\-\\\\ ]*)|(\\G\\\\[^X#\\+\\-\\\\ ]*)|\\G +"); Matcher m = p.matcher(source); while (m.find()) { String s = m.group(0); int lastIndex = list.size() - 1; if (s.equals(" ") && lastIndex >= 0 && !list.get(lastIndex).equals(" ")) { list.set(lastIndex, list.get(lastIndex) + s); } else { list.add(s); } System.out.println("\"" + s + "\""); }
Java使ったことないし、正規表現を知ったのが昨日という俺が適当に答える import java.util.*; import java.util.regex.*; class a{ static public void main(String[]args){ ArrayList<String> list = new ArrayList<String>(); Pattern p = Pattern.compile("\\ +|(\\\\[\\+\\-]?|[+#X-])[^\\\\ +#X-]*|[^\\\\ +#X-]+"); Matcher m = p.matcher("TOP\\+123+123 \\-123-123\\"); while(m.find())list.add(m.group()); for(String s:list) java.lang.System.out.println("\""+s+"\""); } }
180 :
179 :2006/02/07(火) 23:10:36
実は
>>176 が空白の扱いをどうしたいのか、
イマイチ分からんから適当に書いてるんで意図と違うなら指摘よろ
>>176 Java はまったくわかりませんが、
>\+がうまくいかないです。
の参考になるかもしれないので、名前だけ Java に似てる JavaScript で書いてみました。
javascript:alert('\"'+'TOP\\+123+123 \\-123-123\\'.match(/((^| +|#|X|\\?\+|\\?-|\\)[^\3]*?)(?= |#|X|\\?\+|\\?-|\\|$)/g).join('\"\n\"')+'\"\n');
ブラウザのアドレスバーに入れると確認できます。
182 :
176 :2006/02/08(水) 09:42:59
>>179 >>180 できました!すばらしいです。空白の扱いもあっています。連続した空白を1つの単語とします。
あと、ちょっと言いにくいんですが、それに加えて、
'abc' のようにシングルクォーテーションで区切られる文字も1つの単語としたいんですが…
但し、!'とあった場合は、'を文字列とします。!はエスケープです。
因みに、私もおととい正規表現を知ったばかりです。。。
>>181 これもできました。JavaScriptでもできるんですね。参考になりました。
183 :
179 :2006/02/08(水) 10:59:21
えー仕様の追加かよorz 'ABC'が一つの単語になるのは分かった。 しかし、 !' の扱いが分からん。 !'は'XXX'の内部で発生するのか、それとも外部でも発生するのか? つまり ABC 'DEF' !' e みたいに単独で!'が出る可能性があるのかどうか? それとも ABC 'ff!'df'のようにシングルクウォーテーションの内部で出るのか? どっちかによって答えが変わるから。 それと、この次に仕様の追加があったらもう答えないからな。
184 :
179 :2006/02/08(水) 11:11:47
もう面倒だから、エスケープの内部でしか発生しないとヤマを張ってあらかじめ張っておく。 違っていた場合はもう知らね。 自分の前に書いたコードから正規表現の部分だけ変えてくれ。 "'(!'|[^'])*'|\\ +|(\\\\[\\+\\-]?|[+#X-])[^'\\\\ +#X-]*|[^'\\\\ +#X-]+" 文字列のマッチしかしないんで!'の置換は適当にString.replaceでも呼んでやっといてくれ。
>>184 >違っていた場合はもう知らね。
え〜、そんなこと言わないでくださいよぉ〜
なんて言って欲しそうな臭いがプンプンするな。その文章・・・
>>185 いや、単純に飽きた。
Javaが初めてだから、ドキュメント読みながら入門サイトで調べてるし、
正規表現もさっぱりだから調べたりしてる。
が、なんで他人の正規表現のために、
使ったこともないし使う予定も無い言語を勉強しなきゃならんねん気分で根気的に限界
187 :
176 :2006/02/08(水) 13:10:16
>>179 マジ有難う… 動いたっス。もう仕様追加しないっす。
正直うれしいです。
#実はもうちょっとだけありますが、後はこっちでやります。
188 :
デフォルトの名無しさん :2006/02/08(水) 13:33:14
道場スレ落ちてるな
189 :
176 :2006/02/08(水) 16:04:38
ほんとに最後… ''の中に日本語・記号等全ての半角・全角文字を使えるようにするには どうしたら良いでしょうか?3時間やりましたがダメでした… \p{}でゴリゴリやるんでしょうか?
>>189 空気嫁
親切にしてくれた人のこと考えろや・・・
そういう面倒な感じなのは正規表現使わずに 地道にゴリゴリやりたくなる。
おれはそういうのは正規表現だけで何とかならないか タバコ吸いながらボーっと考えるのが好きだな それで簡潔で美しいのが思いついたら オレ脳内でオレが神になるその瞬間が好き
正規表現だからって一気にやる必要ないと思うんだけどね
194 :
デフォルトの名無しさん :2006/02/09(木) 15:52:13
Perlで正規表現使ってとあるファイルをいじってるんですが read(FILE,$buffer,6) $buffer =~s/([\xA1A1-\xFEFE]|\x8E[\xA1-\xDF])\xA3\x0C|\x1B([\xA1A1-\xFEFE]|\x8E[\xA1-\xDF])/$1\n$2/g; (一部分のみ) の場合”不気味”にひっかかったり”ィ”にひっかかったりします ・・・ 何かいい表現はないかなと思って詮索してみましたが分からないのでお力借りたいですorz 文字コードはEUCで1バイト文字も混在してます
>>176 参考にはならないと思いますが書いてみました。(←すこしニュアンスを変えました)
javascript:alert('\"'+'TOP\\+123+123Xab!\'c \\-123\'d#e!\'f\\+g-hXi\'-123\\'.match(/'(!'|.)*?('|$)|(!'| +|#|X|\\?\+|\\?-|\\|.)(!'|.)*?(?='| |#|X|\\?\+|\\?-|\\|$)/g).join('\"\n\"')+'\"\n\n'+RegExp.input);
>>187 >#実はもうちょっとだけありますが、後はこっちでやります。
禁句です。あるなら質問する。そうでなければ黙っとくことをお勧めします。
あ、しまった。もう見てないのね orz
Visual Studioのテキストエディタの検索・置換で使う正規表現は 独特なので戸惑う。 \w とか .* とかは使えないし。 せめて.NetのSystem.Text.RegularExpressionsの正規表現が通るように なればなあと。
そうですねー。
`ー' は要らないと思った。
>>199 それ、VS 2005 でも改善されてないんだっけ?
たしかATLの正規表現と同じような文法だったような(そのもの?)
詳説正規表現の第2版買いました。高くて泣きそうです。 んでp.25の時刻の正規表現のやつで (1[012]|[1-9]):[0-5][0-9] (am|pm) とあったので試しましたが $ echo "1:23 am" | egrep '(1[012]|[1-9]):[0-5][0-9] (am|pm)' 1:23 am $ echo "11:23 am" | egrep '(1[012]|[1-9]):[0-5][0-9] (am|pm)' 11:23 am $ echo "31:23 am" | egrep '(1[012]|[1-9]):[0-5][0-9] (am|pm)' 31:23 am $ egrep --version egrep (GNU grep) 2.5.1 となって困ってます。どこ間違ってますか?
こうじゃない? (1[012]|0[1-9]):[0-5][0-9] (am|pm) ^^
>>207 31:23 am のうち1以降がマッチしてるのでマッチした行が出力される
てか仕様くらい書け。
"9:17 am" や "12:30 pm" のような時刻にマッチする正規表現としてたとえば
[0-9]?[0-9]:[0-9][0-9] (am|pm)
を考えてみた場合、一応マッチはするが "99:99 pm" といった無意味な時刻にもマッチしてしまう。
そこで、時として取りうる1桁と2桁の部分をうまく狭めて
(1[012]|[1-9])][0-5][0-9] (am|pm)
とすればよい。
と、概論の章のこんな内容。第2版第1刷だが。
>>209 だな。狭め方が説明のために端折られてて足りないだけに見える。
catとvacationの例のと同じ。説明不足で惜しいと見るか序章概論上妥当と見るかは悩ましいところか。
つーかregexp関係で本買うなんて…
「詳説 正規表現」は必読書じゃねーの? いっぺん独自実装を試みたことがある。
「オートマトン言語理論計算論」は必読書じゃねーの? いっぺん独自実装を試みたことがある。
ただ独自実装言いたいだけちゃうかとと言いたいだけちゃうかと。
ちゃうちゃうちゃうんちゃう
『詳説 正規表現』を不要だと言い切る人には出会ったことがないんだが 邦訳の曖昧さが気になれば原書当たればいいし
は? 邦訳が曖昧な場合は得てして原文も曖昧。 文学作品じゃないんで。
そうでもない
>>217 あたまわるいなあ
邦訳が曖昧な場合
概念からして曖昧なのかどうかなんて
原文見ないとそもそもわからんだろ
>>217 訳者の理解が足りない場合が圧倒的に多いだろ
訳者は翻訳を生業にするほどだから英語力は並み以上。 かたやお前らは受験勉強程度の翻訳力しかない。 どうあがいても訳者と同じかそれ以下の翻訳しかできないのが常。 ↓ 結局、前後の文脈から読み解くわけだが、 その文脈範囲を広く取ることでなんとか判ったような気になる。 ↓ 英文読解時の前後文脈を広く取るハメになったことがなぜか訳者のせいになる。 ↓ 訳者の理解が足りないニダ
>>218-220 要するに、
意訳・補足を入れてくれないような不親切な翻訳は認めない
ってことだろ、お前らw
アメリカンジョークに対する意訳・補足がない翻訳は たしかにウンコ以下だな
お前らの潜在意識には、「英語には乱文が存在しない」「英語は論理的文章」という刷り込みがある。 実際には、日本語の文章に日常的に曖昧文・乱文があるのと同じように、 英語の文章にも日常的に同じものがあることを理解できない。 なぜなら、お前らは日本語文章しか良し悪しを判断する対象にできないからだ。 つまり、馬鹿ということだ。
不明な部分は著者に確認しながら翻訳したみたいだけど 文枝もいることだし
日本では、論理的にまとまった文章しか、英語の授業では取り上げない。 例えば新聞記事や著名な文学作品。 だが、お前らが実社会で接することになるのは、 文豪でもなんでもないお前らと同様、文豪でもなんでもない外国の一般人の文章だ。 偉そうに翻訳を貶める輩に限って外国人とメールのやり取りをしたことがなかったりする。
原典の文章構成の悪さまで翻訳者の理解不足のせいにする人が集うスレはここですか?
「詳説 正規表現」だけ読んで独自実装しようって無茶な気がしなくもない。
自動羊なら理解している
否定検索ってできたっけ?
231 :
デフォルトの名無しさん :2006/02/19(日) 16:38:18
!付けろ
専門書の翻訳の良し悪しは、英語力よりもその専門に関する知識の方が大事だよ。
独自実装には「詳説 正規表現」は不要と言い切れる。 ドラゴンブックだけ読めば実装できたから。
236 :
デフォルトの名無しさん :2006/02/20(月) 01:49:33
文字列の中で{}で囲まれた部分を抜き出したいのですが 正規表現むずかくてなかなか思い通りにいきません。 ABCDEFG{HIJ}KLMN →{HIJ} としたい場合どうやればよいのでしょうか?
\{.*\} とか。 {}がどう解釈されるかにもよるが。
238 :
236 :2006/02/20(月) 02:36:15
>>237 すいません。質問が悪かったです。
{}は複数出てくるんです。
ABCDEFG{HIJ}KLMN{OPQ}RSTU
といった感じです。
よろしくお願いします。
>>238 答えの質も悪いから
ABCDEFG{H{I}J}KLMN{OPQ}RSTU
ってのもあるか聞かせてくれ。
240 :
236 :2006/02/20(月) 02:46:11
>>239 無いです。
これを気に正規表現を勉強しようと色々調べて
こんな感じかと思ったのですが
\{[^\}]*
後ろのの}がこれじゃひっかかりません。
すいませんがよろしくお願いします。
>>240 Perl ならこんな感じかなあ。
my $str = "ABCDEFG{HIJ}KLMN{OPQ}RSTU";
my @m = $str =~ /(\{[^\}]+\})/g;
242 :
236 :2006/02/20(月) 03:11:09
>>241 教えてくれた通りで無事できました。
助かりました。どうもありがとうございました。
>>242 (`・ω・´) いえいえ どういたしまして
最近始めました。 わかんなかったらここで聞こうと思ってたけど、 案外簡単にできちゃうから聞くこと無いやw
つーかregexpの本k
246 :
pp :2006/02/22(水) 22:35:51
sedという物で設定した正規表現を他の言語に移植したいのですが 以下の表現の意味がわかりません。特に ">><<" の部分 どのたか解るかた教えてください。 s/\([A-Za-z]\)\([']\)/\1>><<\2/g s/\([']\)\([ A-Za-z]\)/>><<\1\2/g s/\([A-Za-z]\)\([-,.:;']\)\([ A-Za-z]\)/\1>><<\2\3/g s/\([A-Za-z]\)\([-,.:;']\)$/\1>><<\2/g s/>><</ /g
単なるセパレータとして使ってるだけじゃねーの
> s/\([A-Za-z]\)\([']\)/\1>><<\2/g ABC' => ABC>><<' ってな感じと思うよ。
>>247 の補足になるかもしれないけど、
「>><<」っていう特殊な正規表現があるわけじゃなくて、
仮にいったん「>><<」という文字列に置き換えておいて、
最後に「>><<」をまとめて目的の文字列に置換しているんだと思う。
普通のテキストに出てこなそうな文字列なら
「>><<」じゃなくてもどんな文字列でも良かったと思われ。
250 :
pp :2006/02/22(水) 23:21:19
>>247-249 ありがとうございます。
言われてみればそんな気がしてきました。
幾つかの文字列パターンを作って実際に試してみます。
ぐはっ。繰り返しのメタキャラなんてないじゃん。 例がおかしかった。 ○ A' => A>><<' っす。スマソ
何かのAAかとオモタ
AAじゃないですよ (>_<)
254 :
デフォルトの名無しさん :2006/02/23(木) 02:18:04
団子はあらゆるスレに顔を出すな
> ・∀・)っ-○●◎- ◆Pu/ODYSSEY こいつか? 書き込んでる内容を見るとワナビーのようだが
256 :
デフォルトの名無しさん :2006/02/23(木) 11:58:54
正規表現ってエッチな響きですね >< s/ちんこ/まんこ/k こうですか?わかりません!><
団子先生はアレでもソフ開持ち
mjsk
VBScriptなんですが、 テキストフィールドの中身が改行文字とスペースのみで構成されたデータをピックアップしたいのです。 この場合、どう書いたらいいですか?
Perlなんですが びちびちウンコ 下痢便 かちかちウンコ 巻き巻きウンコ ウンチッチ ふつうウンコ 野グソ 犬ウンコ という文字列があったとして、「ウンコを含む文字列にマッチ、ただし『かちかちウンコ』は除く」 という指定はどうやったらいいでしょうか? びちびちウンコ 巻き巻きウンコ ふつうウンコ 犬ウンコ だけを抜き出したいです。
261 :
デフォルトの名無しさん :2006/03/01(水) 23:27:57
__,,,...............,,__、 .,,::'゙;'''""''゙''''゙゙""''ニ=;;;;..`.、 lッ'゙ ゙;;;;;;::.,,、 /´_,,,.. ..,,,_ ゙{;;;;;;;i f''"゙ 、 . ' ゙゙゙"` 'i;;;f ヽ l ;-。= .} =。-、 |:;l .;:! }  ̄ ;  ̄ 1{ bl !、 .,.,,,,、 ノ 、ソ 'i ' `゛ ` i;;; ここは俺のスレ。 ヽ _,.=ニニニ=__,、 ' l;;' 俺に (*´Д`)ハァハァ すればいい i `¬―'´ ノ | 'i, ,/ | )`ー---― '
プロバのメールのSPAMフィルターで正規表現使えたらと思う京子の頃
顧客サポート (質問の対応とか) すんのめんどくさいんだよねー
メーラーの方で正規表現を使えばいいと思う。
どうしてWebProg板の正規表現スレは落ちたのに、新しく立てないんですか?
需要がないから
use utf8; if ((/ウンコ/) && ($_ ne "かちかちウンコ")) { }
長く議論するほど扱いが難しいシロモノじゃないだろ。 続けるとしたら実装方式とかパッチの当て方とかそっち方面だな。
そろそろ xpressive VS 鬼車
syslogからプログラム名とIPアドレスを抜き出したいと思っています。 (syslog-ngでの進入検知スクリプト) Mar 8 10:22:01 host01 ftp(pam_unix)[8094]: authentication failure; logname= uid=0 euid=0 tty= ruser= rhost=201.201.101.101 というログを標準入力として、以下の通り処理を流すと while ($data = <STDIN>) { if ($data =~ /\s(\w+)\[.*\]:.*\[([\d\.]+)\]/){ $hack = $2; if ($1 eq $ftpd) { $port = 21; }elsif ($1 eq $sshd) { $port = 22; }else{ next;} という感じで$1がプログラム名、$2がIPになるはずらしいんですが どうもそうなっていないようなんです。 正直さっぱりわからないんですが 正規表現をどう変えたらいいでしょうか。
>>274 特に難しい機能を使っているわけでもないので一つずつ丹念に追えば
わかると思うが、これがさっぱりわからないんなら勉強が足りなすぎると
思われる。
>>274 その気持ち悪い言語はもしや、Perlとか言うものか?
var ftpd = "ftp"; var sshd = "ssh"; while (! WScript.StdIn.AtEndOfLine) { var data = WScript.StdIn.ReadLine(); var port, hack; if (/\s(\w+)\S+\:\s.*rhost=(\S+)/.test(data)) hack = RegExp.$2; if (RegExp.$1 == ftpd) port = 21; else if (RegExp.$1 == sshd) port = 22; else continue; WScript.StdOut.WriteLine(port + ", " + hack); }
my $services = { ftpd => 21, sshd => 22, }; while (my $data = <DATA>) { if ($data =~ /\s(\w+)\S*?\[[^]]+\]:.*rhost=([\d\.]+)/) { my ($port, $hack) = ($services->{$1}||$1, $2); printf "%s\t%s\n", $port, $hack; } }
Mar 8 10:22:01 host01 ftp(pam_unix)[8094]: authentication failure; logname= uid=0 euid=0 tty= ruser= rhost=201.201.101.101 syslogのフォーマットなんてそうめったやたらと変わるもんじゃないと思うのです。 my ($date, $host, $message) = $line =~ m|([a-z]{3} \d+:\d+:\d+) (\w+) (.+)|; 程度で良いんじゃないかなぁ。
>>279 相手が初心者だと思ってバカにしてるのかもしれないが、
せめてテストくらいしてからレスしろよな。
>>280 ぐはっ、、、m(_ _)m
今日、何回目だろうか。。。鬱。
あんまり怒らないでください
すまんこ。
ていうかね、元の質問では「接続元ホスト」と「ポート番号」を抽出したいんだと思うのだが、
>>279 はそのどちらもできてねー。
まったり仲良くいこうや 過疎スレなんだから
>>274 $ftpdと$sshdの条件にひっかからないだけ
なんて落ちじゃないよな?
286 :
デフォルトの名無しさん :2006/03/10(金) 01:08:44
お取り込み中のところ失礼します。
当方スパムフィルター用の正規表現を作ろうと画策中の素人ですが、
例えば"
[email protected] "というアカウント以外の
全hotmailアカウントにマッチさせたい場合どのような表現が考えられるでしょうか?
ぼんくら頭で都合よく考えるに
^\\([^【1】]【2】.*\\)@hotmail.com
という表現の内の【1】の部分に任意の文字列("hogehoge")、
【2】の部分に"∧:and"にあたるメタ文字が
入いれば良いのではないかと想像したのですが、
そういう都合のいい表現はどうも無いようです。
ようするに基本的に理解できていないのですが、
煮詰まってしまって何も思い浮びません。
どうかひとつ御助力お願いいたします。
なお正規表現はEmacsのものです。
287 :
デフォルトの名無しさん :2006/03/10(金) 02:19:03
オッス、オラ悟空! あたまに hoge がついていて、 おしりに gz がついていない というのを正規表現であらわしたいと思っています。 みんな、オラといっしょに考えてくれ!
Perl互換なら ^hoge.*(?!gz)$
>>286 フィルター マッチングルール の検索結果 約 463 件中 1 - 50 件目 (0.47 秒)
>>288 'hogegz' =~ /^hoge.*(?!gz)$/ は真になる。
.* が gz を食えばその後ろに gz は無く、行末に到達できるからだ。
^hoge.*(?<!gz)\z
291 :
286 :2006/03/10(金) 22:23:43
>>289 レスどうも。
私の検索結果とどうも違うようです。
フィルター マッチングルール の検索結果 約 1,110 件中 1 - 82 件目 (0.30秒)
それにこの検索結果の中には具体的な正規表現の話題は少ないようです。
それともなにか別のことを示唆されているのでしょうか。
問題を「任意の文字列を含まない」パターンに対するマッチングということにしぼってみました。
Perlにおける一般的な表現というのはあるサイトで見つけたのですが、
なるほどPOSIX準拠では煩雑になるのですね。
これまたとある別のサイトに正規表現を生成してくれるJavaスクリプトがあったので、
それで「"hoge"を含まない」行にマッチするものを作ってみたのですが…。
^(((((([^h]*)*(h+[^o][^h]*)*)*)*(h+o[^g][^h]*)*)*)*(h+og[^e][^h]*)*)*$
これをxyzzyで試してみたところ固まってしまいました(orz)ので
"hog"にして再び挑戦してみてやっと機能することが確認できました。
それでもたった10行ほどを検索するのに4、5秒かかります。
実用向きには私は何か全く別の方法を考えるべきなのでしょうか?
また、実用云々は抜きにしても、別のスマートな表現があれば教えていただければ幸いです。
ちょwwww ものすごいバックトラックが起きそうですな。
そのスパムフィルターなら正規表現使わなくてもできる
>>291 その正規表現、笑える。
頭の中でオートマトンがマンダラを描いて今にも爆発しそうです。
295 :
286 :2006/03/11(土) 01:35:22
>>293 やはりそうですか...orz。
例えば一番始めに考えたのは、"^.*@hotmail\\.com$"を全部ゴミ箱に移して、
その後"^hogehoge@hotmail\\.com$"だけ救出するという馬鹿みたいな方法だったのですが、
これはいくらなんでも鈍臭い気がしまして。
スパムフィルターの件についてはくだ質に行ってみます。
けれどこう言った表現は結構使う機会がありそうな気がするので、
後学の為に一般的にはどういうふうに解決するのかな、という興味があります。
あと最短一致とかも確かPerlにしかないんですよね。
これは無くても差し支えがない(あっても意味がない)、ということなんでしょうか?
それとも技術的に実装が難しいのでしょうか?
>>292 >>294 なんとなくサグラダファミリアのようなハノイの塔を想像しました。
正規表現的には (?!)等が使えないなら遷移図から
>>291 をガリガリ算出するしかないと思う。
ただ、スパムフィルターという性質を考慮すれば「^([^h]|.[^o]|..[^g]|...[^e]).*@hotmail.com$」くらいで十分実用的じゃないかということでもある。
メーラ選んで
>>293 にするのが理想なんだろうけど。
あと最短一致程度なら利用できない場合の方が少ないんじゃない?
要するに、ホワイトリストが使えないスパムフィルターなんか捨てちまえ、と。
>>291 爆笑しました。そして固まりました。
>>295 一般的には、可読性を考慮して2パスにすると思うよ。
>>286 Emacs 使ったこと無いけど、エスケープは \ を2つ書くらしいことは分かりました。
javascript:(function(){var v='hogehoge';do{v=prompt('救済するユーザIDを入力してください。',v)}while(prompt(v+' さんだけを救済する削除対象マッチの正規表現を書いてみました。','^'+function(s){var x='',l=s.length;if(l>0)
{x='('+(l>1?'.{0,'+(l-1)+'}|':'')+'.{'+(l+1)+',}|'+function(s){var c=l-s.length;var x=(c?'.{'+c+'}':'')+'[^'+s.charAt(0)+']';if(s.length>1){var r=s.substr(1);x=arguments.callee(r)+'|'+x+r}return x}(s)+')'}return x}(v)+'@hotmail\\\\.com$'))})();
上のコードは、行を連結さえすれば... きっと動きます。
Emacs の正規表現を読み進めていったら、グループ括弧やORにも \\ が必要らしい。 さらに、文字の繰り返は * + ? しか見当たらない。orz だとすると、 .{0,3} --> .?.?.? .{5,} --> .....+ 例えば、これが ^(.{0,3}|.{5,}|.{3}[^e]|.{2}[^g]e|.{1}[^o]ge|[^h]oge)$ こうなるってことかな? ^\\(.?.?.?\\|.....+\\|...[^e]\\|..[^g]e\\|.[^o]ge\\|[^h]oge\\)$ うん、おなかすいたから、これでいいことにしようっと。
Emacs だと、繰り返しの {} にも \\ が必要。 \\{0,3\\} とか \\{5,\\} とか書けば使えるよ。
301 :
286 :2006/03/11(土) 15:53:42
おお、なにやら親切な方々が。 今ちょっと手が開きそうにないので、夜に確認してみたいと思います。 ありがとう、ありがとう。
×手が開く ○手が空く
303 :
デフォルトの名無しさん :2006/03/11(土) 16:45:20
1.(?!\d000) だと半角数字1桁+000が続かないものって意味ですか? 2.としたら マッチ 1000 10005 100056 1000567 アンマッチ 10002000 ということですか?
(?!\d000)は”先読み”をする”幅0”のパターン
305 :
デフォルトの名無しさん :2006/03/12(日) 00:38:03
ある文字列を含まない文字列 ^((?!文字列).)*$ でできるよ。 ^((?!hogehoge).)*@hotmail.com$
>>305 それを Emacs Lisp の正規表現で
307 :
デフォルトの名無しさん :2006/03/12(日) 00:46:02
ごめん、^((?!hogehoge).)*@hotmail.com$ はだめだ でもこの辺使えば何とかなるよ
>>300 ありがとう。{ } も使えるんですね。
>>307 ^(((?!hogehoge).){0,8}|.{9,})@hotmail\.com$
いや、そもそも ?! 使わずに...
って、もしや... Emacs で ?! 使えたりして? or2 <--おしりの形がちょとセクシー
指定した数以上の連続する改行を指定した数の改行に変換したいのですが どういう方法がスマートでしょうか? \nに{}は効かないようなので\n\n\n\nを\n\n\nに置換するのを数回繰り返すという 方法で誤魔化してます。 秀丸エディタでマクロに使いたいのですが。
\n\n\n\n+
>>310 レスどうもです。
改行だと最長一致がうまくいかないのか、それも4つの改行が
マッチしたところで終わってしまうんですよ。
エディタ側の問題なんでしょうか。
312 :
デフォルトの名無しさん :2006/03/12(日) 23:33:30
>>311 その他(O) → 秀丸エディターヘルプ(P) → 検索系コマンド →
「\nを使った複数行検索の際の制限について」を読もう。
このスレのまったりした流れが好きです。 でも正規表現初心者です。 どこか解説サイトを教えてください。 言語ならperlがいいです。m(_ _)m
perlなんて死滅すればいいのに
>>317 ありがとうございます。
できれば日本語で初心者向けを
おねがいします。m(_ _)m
最近はいっぱい本が出てていいよね。 そんな俺が最初に正規表現に触れたのは「sed は日暮れて」だった。
その著者、「小柳Ruby子」って続編書いてない?
正規表現って解説本読んだところで・・・ってかんじ 本読んだら ^((?!文字列).)*$ が思い浮かぶか といったらそうでもない。 売られている正規表現本ってただのパターン集じゃん。
ほほう。それで?
その昔、メガバイト近い正規表現を読んだり書いたりした事がある(涙
TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか? そういや64bitにネイティブ対応している2chブラウザてありましたっけ?
にんじん 200円<BR> はくさい 150円<BR> じゃがいも 300円<BR> このような文字列から、野菜の名前と値段をセットにして抽出したいのですが、 「 のいくつかの繰り返し」を表現するにはどのようにすればいいのでしょうか。
\
すみません、*を&に置き換えてください。 *nbsp;にんじん*nbsp;*nbsp;200円<BR> *nbsp;*nbsp;はくさい*nbsp;*nbsp;150円<BR> *nbsp;*nbsp;じゃがいも*nbsp;*nbsp;*nbsp;300円<BR> このような文字列から、野菜の名前と値段をセットにして抽出したいのですが、 「*nbsp;のいくつかの繰り返し」を表現するにはどのようにすればいいのでしょうか。
>>331 Perl で良い?
(*nbsp:)+
>>331 最終的にどのような形にしたいの?
にんじん 200
はくさい 150
のように項目名+適当な区切り+金額+改行
でいいの?
>「*nbsp;のいくつかの繰り返し」だけでよければ
>>332 の通り
ただ、それではだめな実装もある
332さんのとおりでやりたいことが出来ました。 ありがとうございました。
(.*)=(.*)
ありがとう
おっぱいかよ
343 :
デフォルトの名無しさん :2006/03/24(金) 01:02:08
正規表現って grep からはじめるのがいいって本当ですか?
敷居高いわけじゃないし何でも良いよ
345 :
デフォルトの名無しさん :2006/03/24(金) 02:29:40
各々ばらばらの仕様で、正規な正規表現なんて無いというのは本当ですか?
そうなんですか?
正規な正規表現はあるよ
perl互換だったら何でもいい
おおざっぱに言うと grep(の基本的なもの) Perl互換 POSIX拡張 の3つが主流になるのかな。まぁそれぞれ完全独立って わけじゃないし、自分がメインで使うツールで勉強 すればいいんじゃないの?
ECMAScriptや.NET準拠の正規表現
それを言い出すと「おおざっぱに言うと」という前提が崩れる。
352 :
デフォルトの名無しさん :2006/03/25(土) 00:01:57
---- <p> あいうえお </p> <pre> かきくけこ さしすせそ </pre> <p> たちつてと </p> ---- こういう文字列を ---- <p> あいうえお </p> <pre> かきくけこ さしすせそ </pre> <p> たちつてと </p> ---- perl5の正規表現で、このように<pre>要素以外をすべてスペースでインデントしたいです。<pre>要素は無いかも知れないし、複数あるかも知れません。 $text =~ s/\n/\n /g; こうすれば当然、全てインデントされてしまいます。<pre>だけ除外する方法を教えてください。 ※スペースは全角で入れていますが、実際は半角です。
353 :
デフォルトの名無しさん :2006/03/25(土) 00:13:34
<pre>.*</pre>以外をインデントするのが、そんなに難しいことなのでしょうか。
perlなんか使うから面倒なんだよ。awkならこれだけ。 /<pre>/ { preFlag = 1; } { if (!preFlag) { printf("indent"); } print; } /<\/pre>/ { preFlag = 0; } #って、書いておきながら/preの/をエスケープする必要があったかどうか不安な漏れ
簡単ではないんじゃね? $text =~ s/(?:<pre>.*<\/pre>|(?:^|(?<=\n))(.))/($1)?" $1":$&/sge;
mも使えなくはない $text =~ s/(?:\n?<pre>.*?<\/pre>|(^))/defined($1)?"\t":$&/sgme;
357 :
355 :2006/03/25(土) 18:59:47
なるほど。
いまだに Perl の正規表現の m と s が使いこなせてない
(というか使い分けがうまくできてない) ヘタレな漏れ・・・orz
しかし、どうも
>>355 の (?:^|(?<=\n)) とか
>>356 の \n? が
いまいちキレイじゃない気がするんだよなあ。
もっとキレイな解法があればよろしく。
358 :
356 :2006/03/26(日) 05:37:40
下線を任意の文字列、行の概念も捨てて表現すると… __\n__\n<pre>\n__\n</pre>\n__\n__ .↑ ↑ ↑ ↑ 希望するインデントの挿入位置はここ __\n__\n<pre>\n__\n</pre>\n__\n__ .↑ ↑ ↑ ↑ ↑ ↑ ↑ mオプション付与時の ^ のマッチ位置はここ 3番目の矢印の位置に^がマッチする前に<pre>〜</pre>を食い切ればいい。 あらら、「\n?」いらないっぽい。 ということで推敲してこうなった。 $text =~ s/(?:(<pre>.*?<\/pre>)|^)/$1||"\t"/sgme;
359 :
352 :2006/03/26(日) 13:55:09
質問者です。
>>358 を読んだら、
>>355-356 も含めてなんとか
理解できた気がします。
>>そして358で実際にうまく動作しています。
mとsを同時に指定したときの動作が、私はよくわかってないようです。
これから勉強してきます。
ありがとうございました。
360 :
デフォルトの名無しさん :2006/03/26(日) 16:50:23
半角英数字以外を特定のタグで括りたいと考えてます。 変換前:abcDEF123456 変換後:abc<半角英数以外>DEF</半角英数以外>123<半角英数以外>456</半角英数以外> どのようにしてやればよいのでしょうか。教えてくだされ、神な人。。。
検索:(((?![a-zA-Z0-9]+).)+) 置換:<半角英数以外>\1</半角英数以外>
前にも書いたけど、ある文字列を含まない文字列という表現 ((?!文字列).)* は(?!)が使える環境なら結構便利。
s/([^0-9A-Za-z]+)/<半角英数以外>$1<\/半角英数以外>/g;
ふつうに考えればそっちだな ちょっと調子に乗りすぎてた、すまん
365 :
360 :2006/03/26(日) 22:06:53
神な皆様すごいっす。ありがとうございます。 なぜか、文字コードと格闘しむずかしくムズカシク考えすぎてたっす。 多謝。
[hoge] のhogeを抜き出したいのですが、 [や]はパターン文に使えないですよね? どのようにすればいいでしょうか
367 :
366 :2006/03/27(月) 02:35:56
.NETなのですが、「\[」などとすると 認識出来ないエスケープシーケンスです。 というエラーになります。
.NET はよく知らないんだけど、そのエラーを出してるのは正規表現エンジンじゃなくない? "...\\[...\\]" みたいにしてみては?
123から1,2,3を一回の表現で作りたい。いまは改行で取り除いて2回かかってる。無理な注文かな
>>369 どんな値をどんな法則でどうしたいのか条件が不明瞭。
ついでに、例示を含めて質問文が1行しかないのに改行云々まで言い出すのは無理な注文だよ。
# なるほど、正規表現が難しいって言ってる人は問題認識が出来てないんだね
371 :
369 :2006/03/32(土) 18:18:24
([0-9])と\1, ,\nと\n の二回の置換で369の置換を行っています。これを一回でできれる表現があるのかなと
>これを一回でできれる表現があるのかなと 日本語でどうぞ。
なるほどね。(?=...)文が使えるならgオプションと共に1回でできる。 $str = "aaaa123bbbb456"; $str =~ s/(?<=\d)(?=\d)/,/g;
374 :
369 :2006/03/32(土) 19:38:24
<が使えない場合、どうしますか
この場合小出しじゃなくて便乗質問だろう。多分。 小出しなら氏ね
377 :
369 :2006/04/02(日) 04:40:07
すまん。というか標準規格がどうなってんのかよく知らない。あんのかな 否定!の場所が限られているだとか謎が多いな、正規表現は
>>377 標準と呼べるのは POSIXあたりになるような気が駿河、Perlの拡張を(一部)取り込んだものも
それなりにあるから、何を使ってやりたいのかを明示したら?
>>377 質問するなら推敲してからにしてくれ
あと最低限の知識は
ぐぐって理解してくれ
>>374 373さんの置換操作と同じ結果を期待するなら、
s/\d(?=\d)/$&,/g
>>377 369さんが、この置換操作を「どの処理系で実行したいのか」が「謎」。
もうさあ、後から後から情報を小出しにする香具師はスルーしようよ。な。
>>381 いや、こういうのは開発者としていい練習になる。
情報を小出しにするクライアントから、いかに
効率よく「やりたいこと」の全容を引っ張り出すか。
デスマーチに陥ってるようなプロジェクトの半分は
SEやPGにこの「聞き出し」能力に欠けているパターン。
金にならん客は捨てろ
haihai 情報を小出しにした自分を正当化したいんでしょ
いや聞き出し方が悪いだろ 最低限、言語は何かっつーのは言わせないと
そんなこといちいち聞くの飽きちゃったYO!
>>382 それは該当する他スレでやってくれ
一般的なスレでやられると
馬鹿が助長して結果まわりが被害を被ることになる
おこらないで>< またーり進行きぼんぬ
嫌です><
ずっとROMしてまsつ。 過疎スレなんだし仲良くしてください。
んぢゃksk♪
392 :
デフォルトの名無しさん :2006/04/07(金) 12:56:26
^.[^d][^t].*$ で検索かけたのですが、 <html> とか <div style='width:100%; border-bottom:1px solid #888;'> が引っかかってくれません。 やりたいことは<dt>で始まらない行をすべて探したいのですが、 どうすればいいでしょうか?
どんな言語・ツールを使ってるか言わないと答えが得られにくいのでそのつもりで。
>393 秀丸です。
<dt>で始まる行を削除
>395 <dt>で始まらない行を置換ですべて取り除きたいんです。
>>392 正規表現は、基本的に「〜にマッチしないもの」を表すのは苦手なので、
「マッチするのは何か」で考えないと。
・< 以外で始まる行にはマッチする, or
・1文字目が <、2文字目が d 以外ならマッチする, or
・1文字目が <、2文字目が d、3文字目が t 以外ならマッチする
で正規表現を組み立ててみそ。
>>396 >395して、差分を取るとか。
#差分を取るツール? 自分で探せ。
>[^d][^t]
を[^d][^t][^>]に置き換えるとか。
#<dl>にはマッチしちゃうけど。
秀丸で作業するのを諦めるとか。
#例えば grep '^<dt>' でことが足りそうだ。
^[^<]|^<[^d]|^<d[^t] みたいですね。 どうもありがとうございました。
ID:(キャプチャ)(入るかもしれない文字列)?<dd>
^((?!<dt>).)*\n
403 :
400 :2006/04/08(土) 01:05:31
<dt>(.*) :<a href="mailto:(.*)"><b>(.*)</b></a>:(.*)ID:(.*)<dd>
<TD><a href="/img/hogehoge.jpg" class="dl">hogehoge</a></TD> みたいなHTML中の行から、/img/hogehoge.jpgだけ抜くには、どういうパターンにすればよい? あちこちの正規表現解説サイト見たけど、具体例が少なくて理解不能。orz 具体例が多くて、馬鹿丁寧に解説してあるウェブページ無い?
>>406 本当に必ずその例の通りと決まってるなら、
sed 's/[^"]*"\([^"]*\)".*/\1/'
具体例が多くて、馬鹿丁寧に解説してあるウェブページ無い? なんて文句が多いくせに自分の質問は思いっきり手抜きだからな
410 :
デフォルトの名無しさん :2006/04/09(日) 10:04:47
その程度で具体例がないとわからない程度しか正規表現を理解してない のはなにも勉強してないのと同義じゃないだろうか...
じゃあ、なにも勉強してなくても正規表現を使えるように成るページを教えてやればいいかと。 情報工学の学生とかだと、正規表現の理論を覚える事が重要だけど、一般人には実際の使い方で十分でしょ。 自動車工学の学生はエンジンの仕組みとか覚える必要が有るけど、一般人はスタートキー押してアクセル踏めばいいだけ。 rubyだとこんな感じかな。 #!/usr/bin/ruby href_links_array = [] open("index.html") {|file| while line_strings = file.gets href_link = line_strings.gsub!(/.*href="(.*?)".*\n/i, '\1') if href_link != nil then href_links_array.push(href_link) end end } p href_links_array
line_stringsは捨ててるから、 href_link = line_strings.gsub(/.*href="(.*?)".*\n/i, '\1') で十分。まだまだ修行が足りんな。
どうでもいいけど、 >スタートキー押して に思いっきり違和感。
おまいの車にスタートボタン付いてないだけじゃ?
イグニッション
416 :
デフォルトの名無しさん :2006/04/09(日) 12:20:09
日本語の文字に対応した正規表現てないよね \hでひらがな \kで漢字 とかほしいのに
>>416 文字コードとか面倒だからねえ。
実装したら公開してちょーだい。
/あいうえお/i とか出来ると便利かもね。
>>414 普通は「ボタンを押す」か「キーを回す」わけで、「キーを押す」ことでエンジンはかからないなぁと。
しかしそれ以前に、>411の一般人のような理屈で車の運転をして欲しくないと思うのだけど。
421 :
デフォルトの名無しさん :2006/04/09(日) 15:56:24
なにいってんのこいつ
仲良くしてください><
運転免許とるのと同じだけの時間と金をかければ正規表現なんて簡単に覚えられる。
そんだけやればPCRE実装出来るわな。
いや余裕
ゼッテームリ
そりゃぁ誰でもF1レーサーになれないのと同じことだろ。
F1レーサーになるのと同じだけの時間と金をかければ正規表現なんて簡単に覚えられる。
おとなになるのと同じだけの時間と金をかければ正規表現なんて簡単に覚えられる。
JavaでHTMLタグを削除する正規表現はどうすればいいのでしょうか?
丸投げはいかんよ
つまり正規表現を使いこなせるには国際ライセンスが必要と。 一般人に優しくない技術ですね。 ヒント:Javaの宿題スレ。
正規表現ってそんなに難しいか??
アビバでパソコン検定取るのよりも簡単。
つか、なんでHTMLパーサ使わないのか謎。 厳密でない構文処理してリンクの抽出とかやるのは ある意味XMLよりやっかいかもしれんが。
文中に、ある文字列を含まない文をマッチさせる正規表現はどうすればいいんでしょうか?
NGワード
>>437 マッチするものの否定を取った方が楽ですよ
>>439 こんがらがってきてわからなくなってきました・・・
例としてmaxという文字列を含まないものをマッチさせるにはどうすれば・・・
ある文字列を含む文をマッチさせることで ある文字列を含まない文を見つける
どんな言語・ツールを使ってるか言わないと答えが得られにくいのでそのつもりで。
>>440 このスレのログから「含まない」を含む記事にマッチさせればいい
理論的にはある正規表現Eにマッチしない文字列に のみマッチする正規表現E'は存在するわけだが、 具体的にはどうすりゃいいのかね....
質問が抽象的だと具体的な回答が得にくい
存在はするけどすげーめんどくさい表現になるよ、つーことではないのかな。 いや俺も理論的な話はからっきしダメなんだが。
分かってねえなら口出すなよ
正規表現 マッチしない の検索結果 約 24,500 件中 1 - 10 件目 (0.24 秒) 正規表現 マッチ演算子とは、ある文字列が正規表現で表されたパターンにマッチするかどうか を調べる演算子です。この演算子は、マッチした時には真を、マッチしない時に は偽( 空文字)を返します。戻り値が真・偽となりますから、通常はif文やwhile文と 共に ... www.komonet.ne.jp/~perl/chap7.htm - 18k - キャッシュ - 関連ページ
こう? ^([^m]*($|m($|[^a]|a($|[^x]))))*$
あーなるほど。mmまで食っちゃうからだめか... ^([^m]*($|m+($|[^a]|a($|[^x]))))*$ だとmamaxがだめになるし。 後から攻めて ^([^x]*|[^x]*[^ax]x|[^x]*[^mx]ax)*$ とか。結構難しいなこれ。
^((?!max).)*$
特定のレスのことじゃないんだけどさ、 Perl Compatibleな正規表現と特に指定や断りのない限り、 なるべく一般性のある正規表現で書かないか? 最近すぐに (?...) って出てくるからつまんなくてさ。
ホント、つまらん奴だ空気嫁
一般性のある正規表現、ってのがもう既にそこはかとなくナンセンス。
先読み使えば一発なのはみんな知ってて遊んでるんだからさ...
457 :
デフォルトの名無しさん :2006/04/12(水) 16:59:40
JavaScript の質問用スレッドからきました。 if((L[i].href.match(/^.*\.html$/)) || (L[i].href.match(/^.*\.htm$/))) この書き方を縮められませんでしょうか? どうぞよろしく御願いします。
/^.*\.html?$/
正規表現的にはわかりました。ありがとうございます。
if((L[i].href.match(/hoge/)) && (L[i].href.match(/hage/) && (L[i].href.match(/page/) && (L[i].href.match(/pyage/)) こういうのを縮めたいのですが、どうすればいいのでしょうか?
>>460 4つだったら4x3x2x1=24書けば1つの正規表現になるな。
/(hoge.*hage.*page.*pyage|hoge.*hage.*pyage.*page|...)/
それをさらにくくり出せるだろ。 /hoge.*(hage.*(page.*pyage|pyage.*page)|page.*(hage.*pyage)|...
単語の増減や変更が頻繁にあるならえらいことになりそうな。 素直に正規表現の配列をループで回してマッチした方が良いような。
あんまり正規表現使う意味が無いような
>>464 じゃあ何を使って文字列マッチをするの? index() ?
>>460 4パスを1パスに縮めてみました。
でも、コードは伸びちゃいました。or?
var a=[0,0,0,0];
L[i].href.replace(/((?=(hoge)|(hage)|(page)|(pyage)).)*/g,function(){for(var i=0;i<a.length;i++)a[i]|=new Boolean(arguments[i+2])});
if(eval(a.join('*')))alert('ぜんぶめっけ♪');
hogege の中に、hoge と gege をいっぺんに見つけたいなら、
食べない走査がいいのかも。(←意味不明なら読み飛ばしてね)
Perlの正規表現で [0-9a-fA-Z]{16}で表せる文字列以外という表記はどのようになりますか? また{16}が{8}、{12}、{16}のいずれかの場合というのはどのようにすればいいのでしょうか?
!/^[0-9a-fA-Z]{16}$/ /([0-9a-fA-Z]{4}){2,4}/
[^0-9a-fA-Z]{16}
perlなら、s|[0-9A-Fa-f]{16}||gで消しちゃってもいいような。。。
ファイルの絶対パスからディレクトリ部分だけを抜き出すような場合、 どうすればいいんでしょうか。 例えば ~/user/folder/file.txt から ~/user/folder/ だけ。
>>471 Perl でいい?
m#([^/]+)$# で $1 とか。
Perl互換そんなに良いのかな。 マルチプロセッサを考えると探索の順序と枝刈に意味のあるPerlよりも POSIXの方が実装的に将来性が高いのだが
m#(.*/)#; じゃないの?
476 :
472 :2006/04/13(木) 10:38:32
ゴメン、寝不足だな orz
正規表現って顔文字みたいですね(^_^)
(^-^)/(^o^)/
479 :
デフォルトの名無しさん :2006/04/21(金) 12:13:18
replaceを使って 間にある2つ以上のスペースを1つにするには どうしたらできますでしょうか? 「小泉 純一」 → 「小泉 純一」
480 :
デフォルトの名無しさん :2006/04/21(金) 12:14:51
半角スペースが淘汰されたのでもう一度 「小泉 純一」→「小泉 純一」
replaceってなんですか? sedでいいなら s/ */ /g
482 :
デフォルトの名無しさん :2006/04/21(金) 13:13:37
>>481 ありがとう。
*だったんでした。
ちなみにreplaceは置換と言いたかったんです。
2chの半角スペースも正規表現でやってるのかな w
>>482 htmlは、本文中の空白を纏めるのが仕様です。
grep を使って foo が一行に2回以上登場する行を抽出したい場合、 どう書けばいい?
^.*foo.*foo.*$
grep 'foo.*foo'
XMLの中からDOCTYPEの部分だけマッチするパターンってどんなのですか?
<\!DOCTYPE[^>]*> これじゃ駄目なの?
>>490 パッと見間違ってるとこだけ直す
<\!DOCTYPE[^>]*?>
ごめん間違ってなかたt
>>490 grepでやってみたけど改行が入ってるとマッチしない・・・
javaで "START"と"END"に囲まれた中で、最初に見つかったm=の値を取得したいのですが、以下の方法だとzzzが取得されてしまいます。 Pattern p = Pattern.compile("START.*\\s+m='([^']*)'.*END"); Matcher m = p.matcher("START m='abc' b='test' m='de' END START m='zzz' END "); while (m.find()) { String sValue = m.group(1); System.out.println("Value=" + sValue); } 正しい結果は abc zzz と出力して欲しいのですが、どのような正規表現にしたらいいのでしょうか?
START.*?\\s+m='([^']*)'.*?END
496 :
デフォルトの名無しさん :2006/04/23(日) 02:25:02
htmlページ内の 平仮名を片仮名に変換するための正規表現を教えてください
tr/あ-ん/ア-ン/
>>493 なぜgrepを使う… grepは行をまたいでのマッチングはしないよ。
>>498 そうだっだんだ
でも、D言語のstd.regexpで使ったら出来たよ。
だから質問者はどんなツールを使うか書けと。
答えるやつが馬鹿
502 :
デフォルトの名無しさん :2006/04/23(日) 16:50:40
perlで、"で囲まれた文字列をマッチさせたくて".*?" と記述したのですが "自体は含めない方法を教えてください
[^"]
"(.*?)" こっちじゃないかな〜
含まれてる
]% perl -e '$_=q("aaa"); s/(?<=").*?(?=")/bbb/; print $_;' "bbb"
507 :
502 :2006/04/24(月) 13:34:01
>>504 でやってみましたが結果変わりありませんでしたよ
おかいしな
>>507 何をしたいのか詳しく書け。
つーか、>503を無視すんじゃね。
>>507 >>504 は、マッチさせた後に $1 で取り出せばいい、と言ってると思うんだが、
意図は汲んでる?
510 :
デフォルトの名無しさん :2006/04/25(火) 01:51:07
正規表現が長くなってしまったので、二行に分けて書きたいのですが分ける方法はあるのでしょうか?
>>510 Perl や Ruby なら x オプション。
512 :
510 :2006/04/25(火) 02:28:27
対応する括弧の位置を探す場合はどんな感じにすればよいんでしょうか。
正規表現で探す意味があるのか?
ないね。
任意深さにネストした括弧を正規表現で扱えないのは有名だが(有限状態 オートマトンと透過なので、カッコの数を無限に保持することができないって 例の奴)、ある有限の深さまでの正規表現は作れるので、文字列が与えられ てから、深さ=文字列長/2までの正規表現を機械的に生成してマッチさせれば できるよ。
セロ、という文字列を見つけたいが、オセロ、は無視したいので、 次のように書いてみたのですがだめでした。 [^オ]セロ どう書けばよいか教えてください ( ´・ω・`)
use utf8; ソースもUTF-8で書く 読み込むデータもUTF-8に統一
Perlスレと間違えたぴょん
Rubyなら、・・・まあどうでもいいか
>>517 です
教えてくれる人いたらよろしくお願いします!
[^オ](セロ) これでセロがマッチした位置を取得すればいいんじゃないの?
これはどう? /(?<!オ)セロ/
>>524 自分のソフトではその検索式ではいずれにもマッチしませんでした。
何に準拠した正規表現なのかマニュアルに記載がないんでわかりません。
どうダメだったか書いてない時点で釣りだろ。
「いずれにもマッチしない」で、マッチしてほしいケースでマッチしないって
十分わかるじゃん。
>>525 perlでって前提がついてないのに、説明梨に突然perlの正規表現持ち出すってのは
どうよ。
>>524 一言「Perl限定でよければ」と添えればまだモメないものをさー。
本来は環境(ソフト名でも)を言わない質問者を責めるべきだろう
プログラミングに関するソフトではなかったのであえて名前は出しませんでした。 だって2ちゃんねるブラウザなんだもの。ごめんね。
HTMLをパースしてul要素の中のli要素の配列を作りたいんですが… <ul>[改行] <li>aaa[改行] AAA</li>[改行] <li>bbb[改行] BBB</li>[改行] </ul> というソースから "aaa\nAAA","bbb\nBBB" という配列を取得するにはどのように書いたら良いですか? 環境はJavascriptです。
あ、できた "<ul>\n<li>aaa\nAAA</li>\n<li>bbb\nBBB</li>\n</ul>".match(/<li>.*\n.*<\/li>/mg) と思ったら改行2個の時にダメだorz お。これなら? "<ul>\n<li>aaa\nAA\nA</li>\n<li>bbb\nBBB</li>\n</ul>".match(/<li>(.|\n)*<\/li>/mg) 終了タグが2個目のしかマッチしないやorz むー
<li>((.|\n)*?)</li>
>532 お、おおお。量指定子の直後に?を置くと最小マッチになるんか…知らんかった、どうも有り難う!
/ と / に囲まれた正規表現にマッチする正規表現が思い付かない…
>>534 カッコのネストがあるから普通の正規表現では不可能
perlの(?{ code })のような飛び道具を使えばなんとか
なるかもしれないが、そこまでしたら正規表現でできた
とは言わないと思う。
536 :
デフォルトの名無しさん :2006/05/01(月) 21:59:10
m|pattern|
わざわざ「正規表現に」といって悩んでるからには正規表現として 正しいもののみ受理するようなのをを期待してるんじゃないか? 2つの/にはさまれた文字列でよけりゃさすがに悩まないだろ。 真意は534にきいてみないとわからんがな。
539 :
536 :2006/05/02(火) 19:55:19
>>534 /と/に挟まれた文字列以外の何にマッチさせたいんじゃ。
ネスト何とか言っとるが、全部数えて複数個なら一番下の階層から
処理していけばいいんじゃねえ?奇数なら最初から数えてやるか
最後から数えてやるか定義しなきゃ、答えのねえ問いじゃねえか。
\/ や \\/ は?
最近話題の正規表現の一部 について質問です var m = uri.match(/https?:\/\/[^\/]*amazon\.co\.jp\/.*ASIN\/(\w{10})([\/&].*|)$/); 上記はjavascriptのソースの一部なんですが、 正規表現部分の最後の ([\/&].*|)$ が意味わかりません | は何のためにあるんでしょうか? | って選択演算子だったと思うのですが | の右側に何もないので選択できないと思うのですが、 これは[\/&.*]があればそれを、なければ何も選択しないという意味でしょうか? あと[\/&]についてなんですが これは \か/か&のうちどれかという意味であっていますか? それとも\はエスケープシーケンスで /か&のどちらかという意味でしょうか?
>>541 [\/&]は「/ もしくは &」という意味。
手元のブラウザWinIE6ではエスケープしてもしなくてもスラッシュそのものとして扱われたけど
ひょっとしたら何かのブラウザがデリミタと誤認しないようにしてるのかも。
キャラクタクラス内でも \] を使えるように、普通エスケープは効くよ。
で、(pattern|)という構文は(pattern)? とほぼ同じ。
ありがとうございます よくわかりました
544 :
デフォルトの名無しさん :2006/05/03(水) 15:06:34
this is a pen. this(半角スペースを入れたい) is a pen. テキスト中の文字を改行で挟む場合に 半角スペースを挿入したいのですが、 桜エディタ等での置換の正規表現はどのようになりますか
マッチ部分が変数として使えないと無理だよぉ。
546 :
デフォルトの名無しさん :2006/05/03(水) 19:15:54
桜エディタでいろいろやってみましたら、 [a-z]$ と入力すると、検索には引っかかるんですが、置換ができません・・
一度全部の改行の前にスペースを入れてから ". "を "." に戻せばいいんだよぉ。
". \n" を ".\n" に だった
549 :
デフォルトの名無しさん :2006/05/03(水) 22:44:28
たとえば、abcdefgという文字列があって、 この中にbとcがちょうど1回ずつあるかどうかを調べるのは、 正規表現で実現可能ですかね?
if ((/.*b?[^b]*/) && (/.*c?[^c]*/)) { # bとcがちょうど1回ずつある }
あっダメだわ
$入れればいいのか
^ [^cb]* (c[^cb]*b| b[^cb]*c) [^cb]* $ だろ?
555 :
550 :2006/05/04(木) 19:19:10
なるほど、そんな感じでやればいいんですね。ありがとうございました。
556 :
デフォルトの名無しさん :2006/05/05(金) 07:07:45
>>540 > \/ や \\/ は?
\/はありえそうにない文字(例えば@)に置き換えときゃいいじゃん。
\\は別のありえそうにない文字(例えば#)に置き換える。
エスケープ文字なんてそう多くないんだから実用上これで問題ないんじゃ?
英字・数字・記号 3種類のうち2種類が含まれているかを判定する正規表現って可能ですか? 例) abcde × ab123 ○ 12344 × 1!1#1 ○
2種類以上なら… ^([a-z]*|[0-9]*|[記号]*)$ の否定を取るだけでいいかな あとは[a-z][0-9]といった途中で文字種が変化するパターンを1個見つければいいとかさ 2種類だけだと… ^([a-z0-9]*|[a-z記号]*|[0-9記号]*)$ こうするしかないかな?
その3種類から2種類とりだした順列を全部並べればいい。 a.*1|1.*a|a.*!|!.*a|1.*!|!.*1 a,1,!はそれぞれ適切な文字クラスに置き換えてくれ。
>>557 3種類のうち必ず2種類という条件なら
^([a-z0-9]*[a-z][0-9][a-z0-9]*|[a-z0-9]*[0-9][a-z][a-z0-9]*|[a-z記号]*[a-z][記号][a-z記号]*|[a-z記号]*[記号][a-z][a-z記号]*|[0-9記号]*[0-9][記号][0-9記号]*|[0-9記号]*[記号][0-9][0-9記号]*)$
う〜ん長すぎて気持ち悪いナァ
561 :
558 :2006/05/07(日) 01:25:15
あ、俺が
>>558 下段で書いてたのは「2種類以下」だった。勘違いスマソ。
>>560 は
^((a+b|b+a)[ab]*|(b+c|c+b)[bc]*|(a+c|c+a)[ac]*)$
の形を適用すれば半分くらいになりそう
\1\2を駆使すれば更に短くなりそうだけど思いつかなかった。
562 :
デフォルトの名無しさん :2006/05/11(木) 17:22:08
【】←カッコ内をヒットさせたい時に【.*】とすると 下のように1行に2ペア以上があるとカッコ以外の部分までヒットしてしまう… 【正規表現】分からなくてスミマセン【秀丸】 これを解決するには最初の】←カッコ閉じを指定すればいいと思うんですが どうすれば良いのでしょうか?
勉強し始めたばかりの俺様が来ましたよ(つД`)
>>562 【.*?】
で、可能ではないかしら・・・
>>562 どの正規表現実装を使うのか書きなさいな。
【[^】]*】
>>564 正規表現実装?
まだそこまで分かりませんですOTZ スマソ…
只単純に、あんたが使っている「正規表現を解釈しているプログラム」が何か聞いているだけだと思うぞ。
569 :
567 :2006/05/11(木) 18:50:58
571 :
・∀・)っ-○◎● ◆toBASh.... :2006/05/12(金) 06:58:41
自分のプログラムでおかしな動作になる鬼車のソース読んだ 愕然とした onig_searchでregex_tの構造体の中身操作してる。 これ全然スレッドセーフじゃねーじゃん 正規表現オブジェクトのコピーをする関数が見つからない ソース文字列分だけコンパイルすればええんかアレ
>>571 作者に報告 or patch の contribute よろ。
というか、ドキュメントもソースも読んでないので憶測なんだけど、 同じ regex_t を別々のスレッドから利用するのはそもそも間違いなんでは? 普通の正規表現ライブラリはそれでも問題なく動くの? POSIX regex で regerror なんかいかにも問題ありそうだけど。
574 :
・∀・)っ-○◎● ◆toBASh.... :2006/05/13(土) 08:09:07
少なくともboost regex++の正規表現オブジェクトはスレッドセーフ C++ラッパークラス作ろうとして困っている。
575 :
・∀・)っ-○◎● ◆toBASh.... :2006/05/13(土) 08:17:29
Boost Regex++はリージョンオブジェクトさえ別々なら正規表現オブジェクトは複数スレッドで 共有していい仕様になってた希ガス extern int onig_search(regex_t* reg, UChar* str, UChar* end, UChar* start, UChar* range, OnigRegion* region, OnigOptionType option) { int r; UChar *s, *prev; MatchArg msa; if (ONIG_STATE(reg) == ONIG_STATE_NORMAL) { reg->state++; /* increment as search counter */ if (IS_NOT_NULL(reg->chain)) { onig_chain_reduce(reg); reg->state++; } } (以下略) 最初の数行だけで明らかにヤバイっしょ。 排他ロックかけるか、パターンのコピーをとらなきゃいけないんだが、 前者はやりたくないし、後者はパターンのコピーをする関数が見つからない。 実はC++ラッパー作ろうとしてるんだけど、コピーをどうやって実装しようか 悩んでいる。 クラスオブジェクトに元の文字列を含めておいて、コピーコンストラクタで文字列をコピーする形にして その都度onig_newって手もあるんだけど、それって結構ダサい実装じゃね。
>>575 >クラスオブジェクトに元の文字列を含めておいて、コピーコンストラクタで文字列をコピーする形にして
>その都度onig_newって手もあるんだけど、それって結構ダサい実装じゃね。
こうやってるC++ラッパ見た事あるよ
掲示板の投稿規制をしたいので教えてください。 例えば「セクース」という言葉が含まれている場合は排除したいのですが ○セクースなどと言うセクースとは全く関係ない言葉があったとしてそれまで排除したくなのです。 ○のところがひらがなや漢字アルファベットなどでカタカナ以外だった場合は「セクース」という単語がマッチするものとしてくれればいいです。 要するに単語の先頭からセクースというカタカナで始まる場合は排除して セクースのセの前がカタカナだった場合は該当しないとしたいのです。 セクースマシンガンズやセクースピストルズ、セクースフレンドなどは排除してもかまいません。 出来ますかね?
一生懸命頑張れば出来ます。
殆ど無意味だがな。 まぁ、無駄な鼬ごっこはできるが。
>>577 マルチバイトかワイド文字対応の正規表現使うなら
[^ア-ン]セクース
スタティックリンクしてもうるさいこといわないライセンスのライブラリ無いですか? (表示義務も無い奴がベスト)
そんなライブラリは無い
どんくらいのライセンスまでおkなの?BSD?MPL?
ソースやオブジェクトの公開義務が無いってのがぎりぎりっす。
自分のサル知恵じゃ作れないからって 他人の作ったライブラリをあたかも自分で作ったかのように振る舞おうとしてんじゃねぇよ。 素人が見りゃどんなライブラリ使っていても このソフトスゲー=作者スゲー≠このライブラリスゲー の認識しか持たないからいちいち小さいことで自分のプライドが傷つくとか思ってんじゃねぇよ。
簡単な正規表現ライブラリぐらい3日もあれば作れるだろ。
いいのがいっぱいあるんだからわざわざ作るこたないじゃん。 その3日が無駄だよ。
ここで質問してマトモなレスが返ってくるのを待ってる時間の方が無駄だよ。
589 :
デフォルトの名無しさん :2006/05/14(日) 23:38:17
メールアドレスのみを抽出する正規表現はありますかね。
>>589 有名な話だが、validなメールアドレスを正確に正規表現で表すことは出来ない。
マジっすか。役に立ちませんね。
あとくされが無いなら、有料のライブラリでもいいんですけど。 お勧めないですか?
PCRE か Oniguruma か ICU かそのへんでいいんじゃね?
boostにもregex++とxpressiveが。 サイズふくらむけど。
>メールアドレスのみを抽出 spam業者
>596 輝く石ころですか?
Perlの小技かなんかに長いのがあったような・・・
>>598 あれでも制限付きな例だし、
そもそもここで正規表現使うべきじゃないよっていう反例的な意味合いが強い気がする。
あ、それで、メールアドレスのマッチは、
真面目にやるならパーサを使うべきだし、
そこまで必要でないのであれば、ある程度妥協しつつ、
ケースによってパターンを使い分けるのが良いと思う。
場合によっては
>>596 でも良い場合もあるでしょう。
" @ " でもマッチしちゃうと思うんですが。
いや、だから「場合によっては」って言っています。 と思ったけど、さすがに「.+@.+」は無い罠・・・
以前、「?」を含むメールアドレスを使ってたけど、中途半端なチェッ クをするウェブアプリケーションで「メールアドレスが不正」とか怒ら れることがあって遺憾でした。
VBとかで変数名にマルチバイト文字を使う奴と同じ香りがする
「?」を含むメールアドレスを使っているユーザがいて遺憾です。
それはいかんな。
ふつう使わないパターン( "foo"@domain とか)を除けば、 [-\w!#$%&'*+/=?^_`{|}~]+(\.[-\w!#$%&'*+/=?^_`{|}~]+)*@[-\w]+(\.[-\w]+)+ こんぐらいでいいかんじかね。 参考: RFC 2822
もし 1980年 (RFC 821 & RFC 822 以前) に Perl が現在くらい普及していたならば、 メールアドレスも BNF じゃなくて正規表現で定義されていたのでないかと妄想中。
つ正規表現→字句文法
時代的に多バイト文字を使ってもそろそろ許されると思うんだがな
流れ的にメールアドレス内だろうか 正規表現ではマルチバイト文字を認識するのあるし
613 :
デフォルトの名無しさん :2006/05/21(日) 17:14:26
正規表現の勉強するのにこれはいいっていう本はありますか?
614 :
デフォルトの名無しさん :2006/05/21(日) 17:39:18
わざわざ本買って勉強するほどのものでもないような。
615 :
デフォルトの名無しさん :2006/05/21(日) 17:44:59
/\{LOG\}[\w\W]+?\{\/LOG\}/ すみません、これってどういう意味なのでしょうか? \w\Wが突然出てきてわかりません。 お願いします
>>615 変な正規表現…。
[¥w¥W] で「全ての文字」ってやりたいだけ。. でも良いのにね。
>>616 おおっ、なるほど!!
即レスありがとうございました、助かりました(_ _)
>>616 改行を含めたいからとか。俺もよく [\S\s] とかやる。
普通 (?s:) か /s じゃないの?
**さいたま ぬおおおおおお!! :とやまー|富山?
(V)o\o(V)って何にマッチするの?
VooV
正規表現について勉強しているのですが、
>>620 のような文字列で、先頭に何も記号が無い文字列('ぬおおおおおお!!')
をマッチさせるにはどうすればよいのでしょうか?
624 :
623 :2006/05/24(水) 16:25:17
記号というのは、
>>620 の '*'や ':' のことです。
^
626 :
623 :2006/05/24(水) 22:56:56
>>625 thx!!
なるほどね... ^[^\*:]
(*^-^*)/
628 :
デフォルトの名無しさん :2006/05/25(木) 18:21:40
[a−zA−Z0−9] [a-zA-Z0-9]
>>628 正規表現じゃ大文字小文字変換は無理だよ。
間違えた 全角半角変換
>>634 いや、Perlのtrは正規表現じゃないよね。
例えば
>>628 さんの状況だと、文字コードにかかわらず無理じゃないかな。
数字だけなら10回やったらできるけど。
use Encodeしたらできるんじゃない? 試してないけどさ
ていうか
>>635 の「Perlのtrは正規表現じゃないよね」という意味では
「正規表現では無理」なんじゃないの?
use Encode だとするとどうやるの?
s/a/a/g; : s/z/z/g; s/A/A/g; : s/Z/Z/g; s/0/0/g; : s/9/9/g; って全文字繰り返せば「正規表現でもできる」よ。
>>638 単一のs/.../自体は正規表現といっていいだろうけどさ。
でもsコマンドの列全体となると、自明に一個の独立した正規表現じゃなく、
sコマンド(のみ)を使ったプログラムというしかないだろ。
半角->全角方向なら s/[0-9]/\x1B\$B\x23$1\x1B(B/g とかで出来ないか?
設問を勝手に変えるなよ
642 :
デフォルトの名無しさん :2006/05/31(水) 18:19:10
ここでいいのかな。 $hoge = "hehehehe"; hoge($hoge); /* 何かをする関数 */ function hoge() { } みたいになっている場合、/* 〜 */ を削除したいのだが、正規表現で どう消したらいいのか教えていただけないでしょうか。 お願いします。
>>642 s| /\* .*? \*/ ||gsx
644 :
デフォルトの名無しさん :2006/06/01(木) 15:45:57
質問させてください。 perl で全角文字の二バイト目が正規表現の特殊文字になってるとき \x81^ を \x81\^ とかに置換したいんです。(\)を付加したい 上記の場合は s/\x81\^/\x81\\\^/g; で済むと思うのですが、一バイト目の範囲が結構広いので、 なんかうまく書く方法無いでしょうか? お願い致します。
>>644 use encoding 'Shift_JIS';
をやっておいたらどうか?
647 :
デフォルトの名無しさん :2006/06/03(土) 01:11:31
1. <br>--- (0.00%)</td> 2. <br><font color=007f00>-155 (-5.39%)</font></td> 3. <br><font color=ff0020>-2000 (-4.22%)</font></td> 文中から1.と2.と3.のパターンをマッチさせたいのですが、どんな正規表現を用いたらいいのですか?
<br>.*\(\d\.\d\d%\).*</td>
649 :
デフォルトの名無しさん :2006/06/03(土) 10:18:21
>>648 なんか違わない
<font color=があるのと無い場合でマッチしないと思う
>>649 =647
「しないと思う」 じゃなくて 「しなかった」 だろ。
だって問題は<font color=じゃないからな。
ほらよ
<br>.*\(-?\d\.\d\d%\).*</td>
<br>.*?</td>
perlの正規表現では /abc|def|ghi/ よりも /abc/ || /def/ || /ghi/ の方が効率的だそうですが 何故ですか? どちらも同じ効率のように見えるのですが
>>653 後者は正規表現として扱う必要がないからindexとかstrpos的な処理に最適化される
$str='((I)(have (two) (children)))';なんていうのを [[I 1][have [[two 2][children 3]4]5] みたいにしたいのだけどどうすればいいですか。つまり、 内側の括弧から順番にまた左から右に順番に番号を振っていきたい。 while($str =~ s/\(.*?\)/"[$1 " . ++$num . "]"/eg) {1;} こうやってもだめですた。
656 :
655 :2006/06/03(土) 22:06:09
まちがえた。 $str='((I)(have ((two) (children)))';だた。
>>655 1 while $str =~ s/\(([^(]*?)\)/"[$1 ".++$num."]"/ge;
ちなみにここはPerlに限ったスレじゃないからな
^apnic\|JP\|ipv4\|.*allocated$で、 JP以外を捕まえたい場合は、どう記述すれば良いのでしょうか? ^apnic\|[^J][^P]\|ipv4\|.*allocated$だとAPが引っかかるし… ^apnic\|(^JP)\|ipv4\|.*allocated$だと駄目だし(´・ω・`)
>>658 ( | | 内が)「JP以外」ってのは
1文字と3文字以上の時はそのままマッチして、
2文字の時だけ「Jで始まらないか、Jで始まってPで終わらないもの」
と言い換えられる。
^apnic\|([^\|]|[^\|][^\|][^\|]+|[^J]|J[^P])\|ipv4\|.*allocated$
環境によっては
^apnic\|(?!JP\|).*?\|ipv4\|.*allocated$
が使える。
ざっと確認したけど間違ってるかも。
660 :
655 :2006/06/04(日) 01:34:25
>>657 偉そうな口調ですが、あなたのでやるとこうなります。
([I 1][have [[two 2] [children 3] 4] 5]
最初のが変換されてませんね。
それとあなたのと私のではどこが違うのでしょうか。
.*?=最短マッチだから。
661 :
655 :2006/06/04(日) 03:03:12
ごめんなさい。元データが間違ってますた。閉じの括弧が一つ足りなかったORZ
662 :
653 :2006/06/04(日) 09:00:22
>>654 なるほど!そういうことでしたか
最適化ってこれのことだったのですね。ありがとうございました。
663 :
658 :2006/06/04(日) 10:02:29
>659 レスどうもです。 その二つは動かなかったけど突破口が見えました(`・ω・´)
sedとawkとPerlとJavaScriptとC#を使用しているのですが、 各々微妙に正規表現に使えるメタキャラクタが違って萎えます。 「もういい加減統一した方がいいんじゃね?」 みたいな動きは無いんでしょうか
ありません
連続した改行の個数を1つ減らす、ていうのは正規表現で可能でしょうか。 例: 'まんこ\n\nなめなめ\nまんこ\n\n\nなめなめ' → 'まんこ\nなめなめまんこ\n\nなめなめ' Firefox 1.5.0.4 の JavaScript 上での利用を考えています。
js/\n(\n*)/$1/g javascriptではどう書くのかしらんが。
すまん、なんか変な場所にjが残った...
>>667-668 無事動きました。ありがとうございます。
javascript:alert('まんこ\n\nなめなめ\nまんこ\n\n\nなめなめ'.replace(/\n(\n*)/g, '$1'));
どうでもいいけどサンプル文字列にはもう少し誰に見せても恥ずかしくない単語を選ぼうよ。
さすがはセイキ表現だな
聖域?
二十世紀梨
1234567を1,234,567に一発で置換できる正規表現ってないよね。 s/([0-9]{3})*/$1,/g でだめでした。
s/([0-9]{3})/$1,/gもだめだぁ・・・
後ろから3個だからその方法じゃだめだと思うよ
s/(.*\d)(\d\d\d)/$1,$2/g
s/(\d)(\d{3})($|\D)/\1,\2\3/
s/(\d)(\d{3})(?=\D|$)/$1,$2/g
s/\d+?(?=(?:\d{3})+(?!\d))/$&,/g
どれが正解?
実行してみて正しく動いたものが正解。
>>680 $&をどういう意味なのでしょうか?
?:、?=はグルーピング除外はわかるのですが
>>683 「正規表現」のところに書いてなかったら「特殊変数」のところに書いてあるかも。
正規表現全体に合致した文字列。
>>680 すごいね。何桁でもいけた。
?:がなくてもいけたけど、いるのかな?
>>684 正規表現全体に合致した文字列とは、グルーピングは関係なんですよね?
最初の\d+?に括弧がないから・・・。「,」がつくタイミングがいまいちよくわかりません。
正規表現全体ということは、\d+?と(?:\d{3})+が対象になるのでしょうか?
うーん・・・難しい。
687 :
685 :2006/06/05(月) 18:32:39
>>686 これ↓でもいけたよ。
見やすくなってない?
s/\d+?(?=(\d{3})+\D)/$&,/g
>>688 あっ、失礼。
数字以外もある文字列だけで試してた。
文字列yyを含まない という指定はどうしたらいいでしょうか。 [^yy] は文字集合だったのね…
[^y]+
[^y]{2,2}
693 :
690 :2006/06/06(火) 01:12:04
>>691-692 ありがとうございます。
XYZ の並び文字列を含まない というケースではどうなるでしょうか?
Pattern pattern = Pattern.compile(",", Pattern.DOTALL); Matcher matcher = pattern.matcher("<td>10,555</td>"); String string = matcher.replaceAll(""); System.out.println(string); /*<td>10555</td> */ ************************************************************* Pattern pattern = Pattern.compile("<td>(.*)</td>"); Matcher matcher = pattern.matcher("<td>10,555</td>"); if(matcher.find()) System.out.println(matcher.group(1)); /*10,555*/ *************************************************************** 上はカンマを除去します 下は<td></td>で囲まれた部分を抽出します これ2つをくっつけて10555とプリントしたいんですがうまくいきません どう書いたらいいでしょうか
696 :
デフォルトの名無しさん :2006/06/06(火) 23:08:03
VBでいずれか(A or B)のパターンにマッチさせる場合 (A|B)でOK? Perlとかだと真ん中切れてる棒なんだけどそれらしきやつがないんですよ
それは単にフォントの問題だから気にしないでOK (文字コードによっては区別されるかもしれないが)
698 :
696 :2006/06/07(水) 01:33:07
>>695 みた。
いきなりで Traditional NFAとPOSIX NFAの動作の違いの説明というのには
面食らったけど、これから内容が充実していくのを期待するっす。
ところで、(フリーソフトウェアの)mawkもPOSIX NFAタイプのエンジンを
使っていたような。他にはあるかな?
このスレで出てたmonnerもPOSIXだけどサイトがあぼん
701 :
696 :2006/06/07(水) 09:06:24
正規表現をチェックできるソフトって何使ってるの?
エスパー降臨↓
その言語の unit testing framework を使ってひたすらゴリゴリテストを書く。
コスト監視機能付きの正規表現エンジンというのもいいかもしれない。
エンジンの仕事じゃねええ
文法チェックに関してはフロントエンドのエラー番号見るだけ。 時間量に関しては入力の度にエンジン側の負荷を取れるようにすればチェックができる。 開発してみっかな。
正規表現を書くと、そのパターンに適合する文字列が全て列挙表示されるプログラムが欲しい。
組み合わせの爆発的な増大。*を含むとほぼ無限ループ。
大丈夫、俺には無限の時間があるから。
>>709 オマエにあってもサーバには無いんだよ
re-builder
リファレンス的に常備してる本を教えてください
あとはアルゴリズムの本を読んで 一度でも自分で正規表現を実装すれば 効率の良い正規表現とかも分かるだろうね。
x0, x1, x2, ......, x8, x9 とかっていうのを正規表現で置換して x[0], x[1], x[2], ......., x[8], x[9] という風に置換したいのですがどうすればよいんでしょうか? 検索だけなら /x[0-9]/ でできることは分かっているのですが・・・
後方参照のしかたを調べろ
org.apache.commons.jxpath.ri.compiler.CoreOperationMod= { public org.apache.commons.jxpath.ri.compiler.Expression[] org.apache.commons.jxpath.ri.compiler.Operation.getArguments() } を org.apache.commons.jxpath.ri.compiler.CoreOperationMod= { public Expression[] getArguments() } に変更するため、 ^(?>:\w+)(?:\s+)\\w+\.)+(?!\w+=) を使用しましたがだめでした。 アドバイスをお願いします・・・
717ですが、 (\w+\.)+(?!\w+=)だと、 org.apache.commons.jxpath.ri.compiler.CoreOperationMod= { が compiler.CoreOperationMod= { になっちゃいます。 (\w+\.)+で強欲マッチ? しているのいに、なんで「org」からが対象にならないのでしょうか?
((\w+\.)+)=
718です。 ((\w+\.)++)(?!\w+=) で行けました。 ん〜正規表現は奥が深い
後読み、先読みには、文字列の否定ができるのに、通常のグループ化ではなぜ否定ができないのだろうか・・・ (?<!regex) → ○ (?!regex) → ○ (!regex) → ×
722 :
デフォルトの名無しさん :2006/06/08(木) 15:36:58
er又はelが文中につかない表現というのはできますでしょうか。
! /e[r|l]/
>>723 それはperlとかの話でしょ。
純粋な正規表現ではない。
~~~~
>>722 正規表現は補集合についても閉じてるからそのような正規表現は存在する
という意味でできる。でもきっとめんどくさいからやめとけ。
^[^e]*(e[^rl][^e]*)*e?$
「erまたはelが文中につく」正規表現なら簡単に書けるだろうから
あとはマッチ成功と失敗をよみかえればOK。
726 :
・∀・)っ-○◎● ◆toBASh.... :2006/06/08(木) 22:19:36
>>715 (x([0-9]))で捕獲してx\2でおkじゃね?
複数含まれる場合はまぁ工夫してくれ
>>722 これでいける。
^(.(?!el|er))*$
ただ先頭にelが付くとだめだけど。それ以外は問題なし。
正規表現の文字列否定は方実現手段がしょぼいからなぁ・・・
正規表現以外を併用して抜き出したほうがおおむねわかりやすいな
否定表現が難しい理論的な理由をひとことで説明できます?教えてきぼんぬ。
図面が描けるかどうかでしょ。
え?どゆこと?
だから状態遷移図が描けるパターンは正規表現で必ず表現できるけど 否定の場合描けない可能性もあるわけで
/*comment*/を削除することはできますが、 s/\/\*.*?\*\///g /*comment*/を に置換することはできるでしょうか。 コメント内の文字1つ1つをスペースに置換したいです。
>>733 Cのコメント処理は正規表現で扱うには不向きです。
あとで、そういうときにどうやって図面引いて
どうやってそこからプログラムを起こすかの手順を
FAQページに書いときまつ。
>>732 あ、なるほどね。最初からそう言ってくれい。
いきなり「図面」ってなんじゃい?と思ったよ。
>>733 Perl ならこんな感じ?
s/\/\*(.*?)\*\//" " x length($1)/ge;
先に言ってくれ・・・ で、マッチした文字列の長さ分の空白文字を並べれば良いんじゃないの?
あ、あと、Java だといくつも正規表現ライブラリがあるから、 そこまで申告しといた方が良いと思われ。
>>737 import java.util.regex.*;
Pattern pattern = Pattern.compile("/\\*.*?\\*/");
Matcher matcher = pattern.matcher("/* comment */");
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
char[] spaces = new char[matcher.group().length()];
java.util.Arrays.fill(spaces, ' ');
matcher.appendReplacement(buffer, new String(spaces));
}
matcher.appendTail(buffer);
System.out.println(buffer.toString());
>>736 javaのPerl5Utilでx length($1)ができると思ったのですが、だめでした・・・
742 :
デフォルトの名無しさん :2006/06/11(日) 04:16:20
文字列内に含まれる全ての単語を置換したいと考えてます。 ただし、特定のデリミタ("")が含まれてる場合はその中の文字は置換したくない んですがうまくいきません。 (php) $code = preg_replace('/([^\s"]\w+[^\s"])/', 'replace', $src); これだと$srcに「a」が入ってきてもreplaceに置換されません。 (aaaだとreplaceになるんですが) どのように書けば良いのでしょうか。
splitで分割して、偶数番目の要素のみ置換した後、joinしてみては。
>>742 先読みの類が使えれば簡単に書ける。perlならこう。PHPでどう書くかは知らない。
s/(?<!["\w])\w+(?!["\w])/replace/g
「"」が必ず対になっていることを仮定してよければ
s/(^|[^"\w])\w+/$1replace/g
でもいいだろう。末尾側の区切りを敢えて調べないのは、
先読み使わずに食ってしまうと
foo,bar
見たいな時に困るから。
spamメール対策で正規表現を使おうと思ってます。 英文のみの件名を削除したいのですが [a-z0-9]でいいのでしょうか? 大文字も小文字も削除したいのですが。
>> 746 どんなツールで正規表現使おうとしているかくらい書こうよ。 で英文には , とか . もあったりはしないか? とりあえず [a-z0-9]じゃあふつーは(別のところで指定しない限り) 大文字は含まれない。
こういったスパムに対応できない(- -) "最高女性の自宅リアル映像を無料生中継にて配信中!"
>>746 英文SPAMだけ対応すればいいのなら
メールヘッダの国コードだか言語設定だか見て日本以外なら弾くって方が楽
と、オレは聞いた
>>747 すいません、
spam mail kellerというソフトなんです
英文のみの件名を削除したいのですが...
もちろん日本語が含まれている場合は削除しない
にしたいのですが...
[a-z0-9]では、日本語が含まれている場合でも
削除されてしまうのでしょうか?
いいえ
>spam mail keller 珍しい名前のソフトだな。つーか、そもそもkellerってなんだ?
漢字の取り扱いはプログラムの作り次第だから リファレンスマニュアルへのURLとか抜粋が無ければ対処できない。 つーかあそこのサイトにサポート掲示板の過去ログCGIあるんだけど検索したの?
>>750 そのソフトがどういう実装してるか分からないが
海外製のソフトは大抵マルチバイト環境を考慮してないので(略)
というか、件名のみでSPAMと判断するなよ。
>>748 女性 をNGワードにする
ようこそ…… 『男の世界』へ……
>>746 Perl の正規表現を使ってもいいのなら
^[\x20-\x7e]+$
かな。但しメールの Subject: って複数行に渡るこういう書き方も出来るんだよね。
Subject: aaaa
bbbb
cccc
これはおそらく画面に出る時に aaaa bbbb cccc と出てくる。つまり、複数行に
渡る Subject: だったとしてもメールソフトの側で1行に直して出すということだ。
こういったものに対してどのように処理するのかによってマッチする正規表現が変わる
可能性がある。1行に直した後の行に対するものか、それともその前の状態に対する
ものかの違いだ。
SubjectはMIMEエンコードされてますよ
後から小出しに条件出すのやめろよ。先に言え。
常識では?
Mozillaの振り分けフィルタだとデコードしてから比較するから常識というもんでもないね。
762 :
デフォルトの名無しさん :2006/06/16(金) 22:46:55
"は特殊文字に含まれますか?
どの言語の正規表現かにもよるが一般的にはいいえ
>>763 javaです。
文字列に「"」が入ってる場合にはどうしたらいいんでしょうか?
765 :
764 :2006/06/16(金) 23:02:30
自己解決しました
正規表現関係ねぇ
>>765 自己解決した場合も、解決方法自己レスしとけっつーの。
767 :
766 :2006/06/17(土) 07:34:38
自己解決しました
>>768 乙。
個人的に興味のあるテクなんでよかった。
欲をいえばもう少し詳しく。
あと、現行のglibcのregexも、遅延したdfa構築を
しているみたいなんだけど、後方参照も
使えるしどうなんだろうか?
自分で読め? ごもっとも。
ところで
捨てざろう得ない
は
捨てざるを得ない
では?
>>769 そういうつっこみはそのサイトの管理者に言えよ
772 :
769 :2006/06/22(木) 00:11:36
>>770 すまん。
メールでの連絡先はあったけど、直接コメントとかは書けないみたいだったし、
捨てアド作ってメールするのもなあと思ったんで。
>>771 GNU grep のregexは現行の glic (2.3.6だっけ?) のregexとはぜんぜん別物です
(grepの使ってるやつのほうが古い)。でも多分に俺の勘違いっぽいので
忘れてください。
773 :
デフォルトの名無しさん :2006/06/29(木) 18:52:46
ドコモのUTNを切り出すために ser[A-Za-z0-9]{15} こんな風にしたんだけど、[A-Za-z0-9]の部分を11回または15回繰り返すようにはどうすればいい?
11回と15回を|でならべるか、11回のあとに4回を?でくっつけるか といったあたりが素直じゃないか。 ser([A-Za-z0-9]{11}|[A-Za-z0-9][15}) ser[A-Za-z0-9]{11}([A-Za-z0-9]{4})?
775 :
773 :2006/06/29(木) 19:39:43
776 :
デフォルトの名無しさん :2006/07/04(火) 06:15:14
正規表現と正規言語とは同じものでつよね。 正規言語は入れ子構造が許されないということですけど 正規表現では入れ子構造が表現できるではないでつか。 そこら辺どうなってんの。
最初は正規言語族だったけど、 拡張しまくったらつきぬけた。 名前だけはそのまま残ってる。
778 :
デフォルトの名無しさん :2006/07/04(火) 13:59:56
一発でいくのはめんどくさいから
!m/^
http:\/\// && m/.html$/
とかやっちゃうかな?
781 :
778 :2006/07/04(火) 15:33:30
すいません。自己解決しました。
^(?!
http:\/\/ ).*\.html$
でできました。
>>777 (ぞろ目出ますた。)
では、正規表現は、文脈自由文法なのでつか。
ゆえに正規表現は自然言語処理でよく使われる
オートマトンの構造で考えるなら、スタックマシンになってれば 文脈自由法の解析能力を持つだろ。 そういう意味だと現実の正規表現エンジンはそうなってない。 (典型的なNFAエンジンはスタックを持つけどパーサのスタックとは違う) もしやるなら /[.abc(de|[.fg.])+.]+/ こんな力業ができそうだけど、コスト的に実用性に疑問符がつく。
>>784 なーほど(メモメモ。一晩、じっくり考えて見まつ。
外側の[ ]の中のものはみんな文字リテラルに解釈されるんじゃないのかなぁ。
補足: 正規表現・コンパイラは便利な性質を持つ仮想機械の設計論であって 自然法則の発見とか、自然現象の解析ではないのだから 何が真実で何が誤りということはないと思う。
>>786 しかしChomskyは、自然言語は入れ子構造があるから正規言語ではなくて
文脈自由言語だとして生成文法を確立した。ところが、正規表現が
正規言語を超えて入れ子を扱えるようになったのなら、自然現象(自然
言語)の解析に関して、どちらが真でどちらが偽かといった問題も
もう一度論じられていいはず。
>>776,787 言語理論の正規表現と、このスレとかで一般に参照されてる工学的応用の面から拡張した 正規表現は区別して論じてください。 理論の正規表現が入れ子を扱えるように変わった(時代を経てそう進化した)わけじゃない。 工学的応用としてのパターンマッチ技術上、そいういう拡張が一般化しただけですよ。 だから自然言語の解析を理論の点から再度論じても、再度同じ結論が出るに過ぎないのでは。
>>788 べつに区別しなくて良いよ。
自然言語処理でも結局正規表現は文脈自由文法ということで
自然言語を表現する為に使ってる。
自然言語処理のプログラムに、なぜ正規表現を使うんですか?
という野暮な質問は来ない。
hoge<input type="hidden" value="ABC-123" /> hoge<input type="hidden" value="DEF-456" /> 上記の value 部分だけを抽出したいのですが、どのようにすればいいのでしょうか。 秀丸では <input.*value=\"(.*)\"/> で動くのですが、PHP では動いてくれませんでした……。
まあ、そうだろうな。 <input.*value=\"(.*)\" \/> というかその言語での正規表現の基本部分の簡単な書き方の勉強はしたほうがいい。 普段のやりたいことの9割まではそのときの1時間程度の勉強で覚えたことで済む。 残りの1割の部分で聞いたり調べたり悩んだり諦めたりしろ。時間もったいないし。
value=\"(.*)\"\/ これだけでもいいんじゃないの?
その場合は逆にvalue=を残したわけを聞きたいね
秀丸で動作させてたコードを意図の参考にするべきだろうな ぶっちゃけ例でだけなら \"(.*)\"\/ で動作するわけだし きっと他の部分でコレでは駄目な理由があるんだろう
796 :
デフォルトの名無しさん :2006/07/07(金) 20:06:39
>>795 それじゃ type= も抜いちゃうじゃん
正規表現自体は特に間違っていると思わないから PHPのスクリプトのバグか 漢字のエンコード設定他でhogeの部分でのハングとか、そういう雰囲気
>>790 使ってる関数はなに?
PHPにはPerl互換のやつとPosixのヤツがあるよ
これは微妙に動作が違う
実際に試して無いけど、Perl互換のヤツ使ってて / が正規表現の開始or終了にみなされてるとか・・・
とりあえずソース見せてよ
Aに一致したらBに、A'だったらCに といった置換は出来ますか?
>>800 Perlだけど、
$line="AXYDA'XYDAAXYA'XA'A'";
$2? $line =~ s/$&/B/ : $line =~ s/$&/C/ while $line =~ /(A)(')?/;
print $line, "\n";
perlの正規表現が変なんだよ。perl方言と言うか。
?
自分が理解できないものを「変」に思うのは精神分裂症の兆候、 病院に急げ!
そもそも、 803がこのスレのどの流れ、どのレスを受けての書き込みなのか、 わからないのだが。
ふつうリファレンス省略されてれば直前を指す。
>>802 s/(?:(A)|(A'))/(defined $1)? B: C/ge
のように同時に置換しないと場合によってはおかしくならない?
A,A',B,Cが文字通りその文字列ならそれでいいけど。
あらゆる不測に対応するためなら
>>808 でも不足でないかい
>>807 802の正規表現がPerlの方言って事ですか?
標準的な正規表現ってどれ? 日本語対応の文字コードってUTF?
日本語でおk
日本語の文字コードはJISに決まってる。 日本工業標準規格だし。
>>813 JISで決まっている文字コードってひとつじゃないじゃんw
^~
もうさ、基本的にUTF-8に統一しようぜ。それ以外は 「とりあえずサポートするけど動かなかったらごめんよ」 というスタンスでいいじゃん。 携帯ブラウザ氏ねよ。全滅しろ。ちくしょう
そのUTF-8が2種類来るから困るのだが。
引退前にゲイツさんが強権発動してミリヤリちゃんとした統一の符号方式を押し付けて行ってくれたらいいのに。
Perlのモジュール使えば、どんな文字コードも恐れるに足らず。 みんなが困ってるのを傍目に見ながら、どんな文字コードでも 多言語でも簡単に処理できてる漏れ様にとっては、このままの方が ありがたいね。
自分は3種類使ったことがある UTF-8(Webでよく使われる) UTF-7(DBで見る) UTF-16(Windowsアプリ UTF-16というよりUNICODEだけど)
UNICODE対応するには: UTF-8:テキトーなパッチでとりあえずソフトは動くだろう。完全対応が大変。 UCS-4:ある程度ソフトの再設計が必要になるだろう。完全対応はラク。
>>822 日本じゃなければそれでいいのかもしれないが、日本だと
JISかMSか決める
決めても違うほうで作るバカがいるので直させる
やりとりする外部のシステムが両方混在していてめちゃくちゃ
とかいうどうでもいいところで工数を無駄に消費するのだった
UnicodeはSJIS賀来町文字で何かと面倒
826 :
デフォルトの名無しさん :2006/07/12(水) 11:37:24
VBscriptで | が使えないのですが、対象方はありますか?
827 :
826 :2006/07/12(水) 11:47:37
正規表現暦2日です。VBscriptを使用します 状態: 2002/03/26 [1-2] 2003/03/26 [1-2] 2004/03/26 [1-10], 2005/03/28 [1-2], 2006/03/28 [1-2]<br> 状態: なし</td> 状態: 1991/03/26 [1-1]</small> 状態: 1988/03/28 [1-1] 1991/03/26 [1-5]</small> 状態: 1983/03/28 [1-1] 1984/03/28 [1-7] 1985/03/27 [1-4] 1986/03/27 [1-5] 1987/03/27 [1-6]<br> 1989/03/28 [1-5]</small> データは上の5種類です。5行目は途中で<br>がありますが</small>の前まで取得する必要があります。 状態:より後ろのデータを取得したいのですがどういう表記がいいのでしょうか? 状態:+([^<]+)<br></small>|状態:+([^<]+)</small>|状態:+([^<]+)</td> ではうまくいきませんでした。
>>827 行末の <br> や </td> が要らないんであれば
状態:(.*)<
で良さそうだけど、行末の </small> だけは要らないとかなら
いったん行末まで全部とって </small> だけ削除したほうが簡単かも。
829 :
826 :2006/07/12(水) 12:51:23
>>828 行末のタグは必要ありませんが、それだと5行目の途中で<br>
があると、その前までしか取得できませんね。
.
状態:(.*(<br>)?.*)</smal>|状態:(.*)<br>|状態:(.*)</td> だったりして。
恐らく正規表現使わない方が速いし簡単。
具体的には? getcharで一文字ずつ比較?
状態:(.*) で一度カッコの中を取り出して、それに対して (.*)</small> で一致すればカッコの内容で置き換え、 さらに、 (.*)<.*> で行末のタグは切ればよいんでないの?
^状態:(.*)(</\w+>)?$
サクラエディタを使っています。 空の行があったら、その前の行の最後に「\」を表示させたいのですが 何か良い手立てはありませんでしょうか?下のが例です。 >あああ > >いいい ↓ >あああ\ > >いいい
s/\n\n/\\\n\n/
サクラって改行の置換は変な挙動示した覚えがある
>>829 え?VBの正規表現ってそうなの?
普通は最長一致だから一番最後の < にマッチするはずなんだけど。
質問です。 2chブラウザのV2Cで非表示設定をするための正規表現を考えています。 正規表現のルールはJava一般の物が適用されるらしいです。 例えば ぬるぽ ぬるぽ ぬるぽ ぬるぽ というような同じ語句の繰り返しだけのレスを非表示にしたくて 今は (?:^|^\n+)(.{4,}[ \s]*)\1{3,} としています。 しかしこれだと あああああああああああああああ と書いてある程度でも非表示になってしまいます。 そこで .{4,}の部分を、違う文字の連続という風にできればいいなと 思っているのですが、そんな事は可能でしょうか。
POSIXの文字クラスが完璧にサポートされていれば、 ([.ぬるぽ.]+)で可能だけどおそらくサポートされていない。 エイホらの定義から外れてしまうので正規表現と呼べるかも微妙。
841 :
839 :2006/07/13(木) 06:21:16
レスありがとうございます。 ちょっと変えて下記のように直しました。 (?:^|^\n+)([^ \s]{3,})[ \s]*\1[ \s]*\1 これだと ぬるぽ ぬるぽ ぬるぽ ぬるぽ ぬるぽ ぬるぽ というような場合に 「ぬるぽ」に([^ \s]{3,})が一致して\1に記憶されると思います。 \1が繰り返されるが \1の区切りは、全角スペースの場合もあれば改行の場合もある、 といった場合はどう表現したらいいんでしょう。
/ガッ/
正規表現の方言の落とし穴に嵌る香具師多数。 JISかISOで標準正規表現規格を制定してみんな従えば便利なのにな。
>>843 IEEE (POSIX) は公的機関じゃないからだめってことか?
POSIXは準拠程度の互換性しか無いし。
846 :
839 :2006/07/14(金) 23:40:37
すいません。あらためて質問します。 ぬるぽ ぬるぽ ぬるぽ ぬるぽ(1行に4つ)にも ぬるぽ ぬるぽ ぬるぽ ぬるぽ ぬるぽ ぬるぽ (1行は3つだが次の行まで数えると4つ以上) のどちらにもマッチするにはどのように書けばいいでしょうか?
(?:ぬるぽ(?:<br>| |\s)+){4,}
849 :
839 :2006/07/16(日) 10:34:01
>>847 レスありがとうございます。
自分は
(正規表現){4,}
と書いてあった場合、まず最初に1つ
(正規表現)に一致するものがあったら、
それと全く同じ物が4つ以上続く場合にマッチするのかと思っていたのですが、
繰り返しごとに(正規表現)にマッチするか判断されるんですね。
今度はその「ぬるぽ」が「ぬるぽ」とは限らないが
毎回同じ言葉の場合にどう書けばいいのかわかりません。orz
ぬるぽ ぬるぽ ぬるぽ でも
ほげげげ ほげげげ ほげげげ でも
はががが はががが はががが でも
マッチするが
ぬるぽ ほげげげ はががが
にはマッチしないようにするにはどうすればいいんでしょう。
>>847 の「ぬるぽ」を単純に「.{3,}」に置き換えると
ぬるぽ ほげげげ はががが
にもマッチしてしましますよね。
>>848 すいません。
オライリーの正規表現の本とか買ってちゃんと勉強すれば
わかる事なんですよね。きっと。orz
851 :
デフォルトの名無しさん :2006/07/16(日) 17:40:22
MySQLをのregexpを利用して条文データから正規表現的な検索をしたいと思ってます。 例えば select * from JouBun where title regexp '^第[1-9]+[0-9]?条' みたいな感じです。 上記の例はうまく行くのですが、 select * from JouBun where title regexp '^第[1-9]+[0-9]?章' となると全く検索されてきません。 defaultのcharacterはsjisを使用してます。どなたかご存知の方いらっしゃいましたらお教え願えませんでしょうか? よろしくお願いいたします。
文頭に空白があるなどの理由で「第○○章」は厳密な文頭から始まっていないからマッチしない
853 :
デフォルトの名無しさん :2006/07/17(月) 03:34:52
>>852 どうやらその通りでした。
select * from JouBun where title regexp '^[ ]?第[1-9]+[0-9]?章'
でものの見事にマッチ!!
ありがとうございました。
でも条の前にも半角スペースあったんですけどね・・・・
一つだけの半角スペースは無視するけど、2つ以上だと無視しないって事でしょうか・・・
すみませんが、教えてください。 Windowsで作られたテキストファイルの中に、 ファイル名をフルパスで書かれた行があります。 ここからファイル名を除いたパスを抽出したいのですが どのようにすればいいのでしょうか? 例: c:\xxx\test.txt > c:\xxx\ e:\xxx\yyy\zzz\readme.txt > e:\xxx\yyy\zzz\ ドライブやフォルダの階層はまちまちです。 よろしくお願いします。
855 :
854 :2006/07/19(水) 15:26:01
追記します。 フルパスが書かれてる行は指定できるようになったので、 テキスト全体から抽出するための条件は考えなくていいです。 ドライブ名やフォルダの階層がまちまちの、一行のフルパスから、 ファイル名を除いたパス名だけを抽出する方法を教えてください。
(.+)\\
857 :
854 :2006/07/19(水) 15:46:14
ありがとうございます。できました。 本当に助かりました。
>>856 ,857
テキストファイルが ShiftJIS だとして
C:\表\abc\123.txt
とかは失敗するが OK ?
>>858 Perlはそういうのも考慮させることができるよ(他の言語だとどうだか知らないが)。
Perl の場合は use encoding 'shift_jis'; をプログラムに書いておくか、または
コマンドラインで -Mencoding=shift_jis のオプションを付ければいい。
その前に、どう失敗するのかと
質問スレとして生きるなら質問テンプレ作ろうぜ どいつもこいつも回答者を超能力者か何かと勘違いしている
エスパー以外は解凍しなくていいよ
>>862 どこにお宝zipがあるか探しちゃったじゃねーか。
\b って何をもって単語区切りとしてるんだっけ
\n
>>865 Perlでは\Wと\wの間(またはその逆)と書いてあった
\t
869 :
デフォルトの名無しさん :2006/07/23(日) 00:11:13
拡張子jpg,gif,png以外のファイルを抽出したいのですが全く上手くいかないので教えてください。 \W\.(jpg|gif|png)$ な感じかと思って試行錯誤しましたがダメでした・・・
お前には無理だ 諦めろ 夕日が呼んでるぜ
\f
\g
>>872 それってperl固有でねーですか。汎用的には無理?
汎用的って何ですか You の使っている処理系で動くように書けば汎用的ってことになるんですか その割にどのツールで使いたい etc の情報が皆無なんですが
POSIX標準でないかなぁと。ならツールを選ばんでしょ。
そんなことはない
\\
>>872 > /^.+\.(?!(jpg|gif|png)).+$/
は/^.+\.(?!(jpg|gif|png))[^\.]+$/の方がいいね。
\p
>>872 >>880 foo.jpgfとかの拡張子がjpgじゃないファイル名まではじいちゃうのでまずい
/^.+\.(?!(jpg$|gif$|png$))[^\.]+$/
でどうかな?
<a href="./nikki.cgi?no=060805">2006/08/05</a> <a href="./nikki.cgi?no=060804">2006/08/04</a> <a href="./nikki.cgi?no=060801">2006/08/01</a> ・ ・ <a href="./nikki.cgi?no=040101">2004/01/01</a> というリストがあって、no=の後の番号を抽出したいのですが、 <a href="./nikki.cgi?no=(.*)">20ではうまく抽出できませんでした。 ご教授いただければ幸いです。
とりあえず、?とか.はエスケープしとけよ。
>>885 ?を\?に変えたところ、うまくいきました。
ありがとうございます。
887 :
デフォルトの名無しさん :2006/08/18(金) 13:34:24
889 :
デフォルトの名無しさん :2006/08/18(金) 14:28:03
全ての2chAAにマッチする正規表現をくだしあ。
>>889 .*
2chAA以外のものにもマッチするけどな。
IPアドレス 255.255.160.0 - 255.255.191.255 にマッチする 正規表現を教えてくれたらお礼に私
255\.255\.1[6-9]\d\.\d{1,3}
255.255.195.400
こんなふいんきになるのかしら? 255\.255\.1([6-8]\d)|(9[01])\.([0-9]$)|([1-9]\d$)|(1[1-9]\d[1-9]\d$)|(2[0-4]\d$)|(25[0-5]$)
あらやだこぴぺみす。 255\.255\.1([6-8]\d)|(9[01])\.(\d$)|([1-9]\d$)|(1\d\d$)|(2[0-4]\d$)|(25[0-5]$)
897 :
891 :2006/08/19(土) 14:13:05
もういいです 255\.255\.1([6-8]\d|9[01])\.([01]?\d\d?|2[0-4]\d|25[0-5])
255.255.165.04
32ビット整数にして 0xffffa000以上0xffffc000未満の判定をしたほうが速そう
なんでもかんでも正規表現でやろうとしないほうがいいよね。
>>891 はその典型。
>>891 程度なら正規表現で充分だろ。第一第二オクテットは固定だし。
実運用上、正規のIPアドレスしか評価しないなら冗長な第四も不要になる。
↑IPアドレスということを理解してるなら範囲が変動しうるということも理解して下さい。
>>902 理解してるが、それって正規表現使うかどうかと関係ない話だなw
正規表現だとメンテナンス性が悪いと言うことはスレの流れを見て理解できた。
>>891 は用途によっては
255\.255\.1([6-8]\d|9[01])\.\d+
で十分実用的な気がする
もうええちうねん
255.255.160.0 MASK 255.255.224.0 REでないけど
911 :
デフォルトの名無しさん :2006/08/24(木) 23:00:10
冥王星除外記念 /(([水金火木土]|[天海]王)星|地球)/
一番外側の括弧いらなくね?
913 :
デフォルトの名無しさん :2006/08/24(木) 23:06:46
ああ括弧外すの忘れてた
セレスとか入んなかったの?
「冥王星を残すならケレスやカローンも入れよう」 「それはいやだから冥王星は惑星未満ってことで」
衛星以上惑星未満
矮惑星?
矮惑星は惑星にあらず
猥談やめろ
水金地火木土天海 だと何かリズムが悪いよなぁ。
「水金地火木土天海?」って疑問系にすればよい
水金地火木土天海萌
ホルストは先見の明があったな
(´・w・)ウェ?
小説正規表現ってみんな読んでるの?
推理小説ですか?
>>928 僕は友達からそういうのがあるって聞いただけなんだけど
とてもむずかしい話らしいよ
なんだそれはw
詳説か
そういえばジェフェリーのブログで新しいのが出たとか言ってたような。
×ジェフェリー ○ジェフリー
>>933 Amazon.comのデータを見ると今月頭に出たみたい。
早速注文したが、到着予定が9/19。
それでも Amazon.co.jp経由で注文すると来月末になっちゃうから
ましっちゃまし。
Perl6 の Rules とかに関する記述はあるのかな?
937 :
デフォルトの名無しさん :2006/08/29(火) 21:38:52
abc という文字列にマッチしない正規表現って /[^(abc)]/ じゃあだめ?
だめ
939 :
935 :2006/08/30(水) 02:46:24
>>936 んーどうだろね。Perl 6のRules 自体が、ほぼfixされているとはいうものの
仕様が流動的だし。
とりあえず Amazonのページにある情報では分からんね。
regex.infoにもそれらしい情報はなし。
まあ届いたら報告しますわ。
>>937 よく見る勘違いだけど、なんでそれでいけると思ったの?
IPアドレスって判定するのも操作するのも面倒だな。 もうちょっとマシな表現にすれば良かったのに。 IPv6の::も面倒だ。
>>941 IPv6 アドレスなんかは特に、正規表現で全部やろうって方が間違いでしょ。
>>940 [^a] でaじゃない文字でしょ
(abc)でabcというグループでしょ
だから[^(abc)]でabcという文字(列)じゃない文字
と思った
944 :
デフォルトの名無しさん :2006/08/30(水) 16:32:28
>>943 思ったとおりに物事がすすめば世の中平和さ
>>943 /(?:(?!含ませたくない文字列).)*/
946 :
935 :2006/08/31(木) 02:03:09
なんかもう届いたよw まだぱらぱらとしか見てないんだけど、ぱっと見増えているのは PHPのpreg*の説明があるところ? Javaのバージョン間での拡張の差とかもあるみたい。 で、残念ながら Perl 6に関する記述はない模様。 2nd ed.は行方不明なんで具体的にどう変わったか調べろというのは勘弁ね。
>>945 それだと abc を仲間はずれにしたいとき
abcdef だと空文字列がヒットして
defabc だとdefがヒットするからダメだよ。
>>945 テストしたらどんな文字列にもマッチするよ
oniguruma + VC の話題ってここでおk?
>>946 Amazon の説明を見た感じだと、
あとは Ruby, MySQL あたりが追加と Java がより詳しくなったのが変更点なのかな?
個人的には、 Ruby の既存の Regexp と鬼車との違いなんかが載ってると嬉しいな。
>>952 「バックリファレンスの有無で文法が変わる」と問題「ありすぎ」なの?
そう。ありすぎだろ。 (1+1)と1+1の結果が変わるようなら、言語として設計が変。
Rubyは(1+1)と1+1の結果が違うのか。酷い言語だな。
956 :
デフォルトの名無しさん :2006/08/31(木) 23:29:05
Rubynohanasinankasitenai
957 :
935 :2006/09/01(金) 00:48:22
>>951 えと、全部で章立てが十あって、JavaとかPHPは章がひとつ割かれているんだけど
RubyやMySQLはないっす。
索引を見てもRubyで引けるのは大して項目数がないし、
Onigurumaという項目もないから、ご希望のものは多分
載ってないんじゃないかなあ。
そもそもジェフリーが鬼車の存在を知っているのか疑問に思ったりw
>>950 これ眺めてて思ったんだけど、正規表現ってどんだけ種類あるんだ?
POSIX
Emacs
grep
Java
Perl
Ruby
>>959 挙げるだけ虚しくなるくらい無数にある。
もうね秀丸とEclipseとsedで正規表現使うけどそれだけで嫌になる 特に参照パラメータとかね
正規表現ってカップラーメンで言うとあれに似てるな
Perl方式が主流になりつつあることに警告したい。 メニイコアの時代になれば探索の順序に依存する仕様が 並列化のネックになる。 POSIX化すれと言いたい。
POSIXって言明あったっけ? あれがないと俺、生きていけない
正規表現って方言あり過ぎ どこが正規なの?
方言はいろいろあっても正規文法を扱うところは同じじゃないのかな
>>966 俺は
>>965 じゃないが、基本的にはそういうことだよな
ただ、現在のPerlやRubyなどの「正規表現」は拡張されまくった結果、
既に正規文法では表現できないものも表現できるようになってるが…
968 :
デフォルトの名無しさん :2006/09/09(土) 18:28:43
次に示す四つの例で、全てのパターンにマッチするにはどうすればよいでしょうか? 1. href="..." 2. href='...' 3. href=... 4. href = ... ※4はイコール記号の前後に *いくつかの* スペース(タブも含む)があるとする 1〜2は「href=("|')」と表現することが出来ましたが、3〜4はどう表現したらよいか分かりません。 よろしくおねがいします。
>>968 その前に、HTML的には 1. だけが正解
XMLじゃなくて?
href( |\t)*=("|'|)
>>969 2.も正解。
>By default, SGML requires that all attribute values be delimited using either double quotation marks (ASCII decimal 34) or
>single quotation marks (ASCII decimal 39).
>Single quote marks can be included within the attribute value when the value is delimited by double quote marks, and vice versa.
>Authors may also use numeric character references to represent double quotes (") and single quotes (').
>For double quotes authors can also use the character entity reference ".
href *= *((['"]).*?\2|\S*) =の途中にスペースが入るのはどうかと思う…。解釈してくれるブラウザはあるの?
普通に空白文字を無視してリンク飛ばしてくれるぞ > 手元にあったIE6とFF1.5のどちらも ダカラHTMLなんてパースしたくねぇ (;´д⊂)
とりあえず、まずHTML標準に対応してから拡張を考えないか
976 :
975 :2006/09/09(土) 20:15:41
ごめん、読くみたら対応してた
978 :
968 :2006/09/09(土) 21:41:47
皆さん、ご回答ありがとうございました。
>>969 言われる通り、二重引用符、または単引用符で括る約束ですね。
例外もありますが、XHTMLでは全て括る約束のようです。
つまり、仕様に基づいて(X)HTMLドキュメントを作成しない著者が多いので
こちとら正規表現に苦労しているわけです。(いや、冗談、これは私が悪い……)
>>977 仕様書じゃないかな?
バカの1つ覚えみたいに何でも正規表現でやろうとすると行き詰まる
なんでもかんでも正規表現でやりたい派
正規表現でできないのは努力が足りないから。 もっと精進すれば、必ずできると信じているから。
何かの宗教だなw
日経BP:「正規表現が広がる現状を、規制緩和を推進してきた立場から、 どのように感じているのか? 奥谷:「正規表現論は甘えです」 日経BP:真意を確かめようと質問を重ねると、奥谷は苛立った ように言葉を畳みかけた。 奥谷:「競争はしんどい。だから甘えが出ている。個人の甘えが、 このままだと社会の甘えになる」 「今の一致はほとんどが ”ぜいたく一致” 比較したい文字列と パターンが違うということを客観視できていない」
>>968 もれがよく書く正規表現
つ m/href\s*=\s*(\'|\"|)(.*?)\1[\s>]/i
俺なんか正規表現のお陰で彼女ができたぜ
umeage
s/^99[\d]+(.*)//g
991 :
デフォルトの名無しさん :2006/09/13(水) 08:31:50
1000だったら漏れ億万長者!
残念
9/√9=3
1000は君に譲ろう。
1000を取りたい者は俺を乗り越えて行け。
9-√9=6
すみません質問です 正規表現でaからzまでの文字を順に出力するにはどうすればよいですか? たとえばperlで @atoz = /hogehoge/; としたら $atoz[0] = 'a'; $atoz[1] = 'b'; $atoz[2] = 'c'; みたいになって欲しいのですが。
$_ = 'abcdefghijklmnopqrstuvwxyz'; @atoz = /(.)/g;
> $_ = 'abcdefghijklmnopqrstuvwxyz'; ここが反則です。
>>998 どうしても正規表現でやるのか…。
@atoz = "a" .. "z";
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。