1 :
デフォルトの名無しさん :
2006/08/24(木) 19:04:59
とりあえずまだpart2が埋まってない
3 :
デフォルトの名無しさん :2006/08/24(木) 22:10:05
Javaで文字列属性チェックに使ったら糞重かった。 "[A-Za-z0-9]*"でサクッと半角英数字チェックするだけなのに 'a' <= c && c <= 'z'とかで判定する方が10倍速かった。 うーん、スクリプトだから許容できるのが正規表現だとでもいうのか。
もっと複雑な場合こそが正規表現の使いどころ。
/.*/
7 :
デフォルトの名無しさん :2006/09/12(火) 00:58:15
前スレは1000盗り合戦会場
infoseek インフォ正規 インフォ精液
aaa111bbb222 という文字列から 変数aに111を、変数bに222を 格納するようにするにはどうしたらいいですか
"aaa111bbb222" =~ /\d+/ a = $& でaに111は格納できたんですが 222も見るにはどうしたらいいですか
>>10 Ruby なら scan を使うと文字列を逐次正規表現マッチできて便利だよ。
"aaa111bbb222".scan(/([a-z]+)(\d+)/).each { |key, val|
p [key, val]
}
ブロックの中は適当に料理してちょ。
ありがとうございました。 a = Array.new "aaa111bbb333".scan(/\d+/).each{|tmp| a << tmp } てな感じで解決しました。ありがとうございました。
a = "aaa111bbb333".scan(/\d+/)
なんかスクレイピングとかリライトっぽい質問ばかりだな
それ以外の質問をしなくては何か都合が悪いことでもおありで?
わたしと正規表現とどっちが大事なの? って言われたらどっちを選びますか?
性器を選びます。
jul8,jun1というような日付を jul08,jun01のように前に0を入れたいのですが これを正規表現で実現しようとすると 数字と文字を別々にマッチさせて $10$2のように書くと、$10と解釈されてしまいます エスケープは置換文字列では使えないようなんですが 何か良い方法はあるでしょうか?
19 :
デフォルトの名無しさん :2006/09/14(木) 13:08:08
実装言語は何かを言ってくれないと的確な回答はできないと思うのだが、 勘で "${1}0${2}" とか。
>>21 正規表現テスターをとりあえずダウンロードした。
23 :
デフォルトの名無しさん :2006/09/14(木) 19:19:36
(?:$1)0$2
もともと jul08,jun01 がまざってたら jul008,jun001 ができる
>>25 んなこたあない。
s/([a-z]+)(\d)\b/${1}0$2/g;
Ruby互換のOnigurumaという正規表現エンジンを TextMateというエディタから用いて変換していました。 日本語マニュアルがないため、置換文字列でどんな構文 があるかきちんと調べた事がなかったですが、今回気になって 調べてみると(?1:$1)0$2という置換文字列でうまくいきました。 Perlのやり方も凄く勉強になりました。 お騒がせしてすいません。
$1\x30$2 なんて方法もある。
青空文庫のルビを消したいのだが 《.*》 だと 朝の|挨《あい》|拶《さつ》を が 朝の|挨が になっちゃうわけです。同一行に《が二つ以上現れなきゃいいんだけれども 実際現れるから困る。知恵を貸して欲しい
>>30 s/《.*?》//g;
「perl 最短一致」でググれ。
サンクス!なるへそね。恩にきる
行頭の1〜3文字目にスペース以外の文字がある行を マッチささたいのですがどうしたらいいですか?
/^([^ ]| [^]| [^ ])/とか、perlでif (/^.../ && $& =~ /[^ ]/)とか。
/^.{0,2}[^ ]/ 勿論 !/^ / とはマッチするものが違う
>>33 Perlなら、
$str !~ /^ /
じゃダメなの?
>>36 それだと空行や1個や2個しか文字が無い行もマッチするけどね。
38 :
デフォルトの名無しさん :2006/09/21(木) 00:03:58
[\n][\n]* この正規表現は、二つ以上の連続した改行文字(\n)にマッチしますが \n と \nの間にいくつかの空白文字(半角スペース, タブ)がある場合にマッチする表現がわかりません。 一応「 [\n](|[\s]*)[\n] 」と書いてみたものの、思うようにマッチしません。 どう表現すればよいのでしょうか? よろしくおねがいします。
>>38 で、何を使ってでそれをやろうとしているの?
\s とかあるからPerlかな?
マッチングに使っている部分全部さらしてみ。
>>38 正規表現勉強しなおせ
/\n\s+?\n/
オマエモナーw
s
43 :
38 :2006/09/21(木) 20:50:34
>>39 PHPのpreg()系です。
HTMLの<textarea>から</textare>に入力された文字から、連続した改行(=空行=)を取り除こうと思ったのです。
ただ、空行ではないけれど、改行と改行の間にスペース(タブも含む)がある行も取り除きたいのです。
これはどう表現すればよいのでしょうか?
当然ですがtextarea要素の内容は、全体を一つの文字列として扱うので「 ^$ 」という表現はダメでした。
>>43 Rubyならhtmlパーサがあるから簡単に処理できるのだがな。
>>43 > PHPのpreg()系です。
先に言えよ、ヴォケ!
$html = preg_replace_callback('{(?<=<textarea>)(.+?)(?=</textarea>)}si',
create_function('$matches',
'return preg_replace("/(?<=\\n)\\s*\\n/", "", $matches[0]);'), $html);
題は空行削除であって、textatraタグは無関係でしょ
47 :
45 :2006/09/21(木) 23:43:23
>>43 そんなときは、一度でやろうとせずに
まず
「空白のみを含む行を削除」してから
「連続する改行を1改行に置換」するといいかもね。
50 :
デフォルトの名無しさん :2006/09/22(金) 00:24:19
phpのeregで @abc.gr.jp と @wxy-z.co.jp 以外のアドレスを拒否する場合 どうしたらいいでしょうか。
51 :
45 :2006/09/22(金) 00:47:13
>>43 ただのpreg_replaceでこんな感じでいけるだろ
/(^|\n)\s*(?:\n)/
あっちのスレで話題になってた各ブラウザの挙動がどうのは知らん
53 :
デフォルトの名無しさん :2006/09/23(土) 08:29:03
Perlで、 &gt; から &lt; に含まれる <br> のみ全て削除するにはどうすればいいでしょう? $str =~ s/&lt;(.*?)<br>(.*?)&gt;/&lt;$1$2&gt;/g; でやってみたのですが、<br>が複数ある場合ひとつしか削除できません。 いろいろ調べたんですが行き詰りました。 低レベルな質問かもしれませんがお願いします。 (文中の&は全角ですが実際は半角でやってます。)
sub delbr { my ($tmp) = @_; $tmp =~ s/<br>//g; return $tmp; } を用意した上で s/&gt;(.*?)&lt;/delbr($&)/ge;
55 :
デフォルトの名無しさん :2006/09/23(土) 17:59:43
エディタとかで検索や置換する程度なのですが、
正規表現だけで、Not条件を加えるのは無理なんでしょうか?
http://www.kt.rim.or.jp/~kbk/regex/regex.html#CCLASS にあるような、よくある勘違いの例と同じなのですが、
ここで言うと[^foo]が"foo"以外では無く、fとo以外の一文字をあらわすのはわかります。
でも、それではその"foo"を全体を含まない文字列というのを
表現(追加)したい場合はどうすればいいんでしょうか?
"|"でorが出来るみたいにnotできたら簡単確実なのに、うまく除外するのに毎回頭を絞ってます。
検索等フロントエンドの実装で、否定条件指定のフィルタリングがある場合ならいいんですが…
例えば[^(giko|mike)]nekoみたいな感じで、簡単に文字列や正規表現全体を
否定(〜以外)できたらなにかと便利だと思うのですが、
それは正規表現の範疇外なのでしょうか?
うまくやる方法はありますか?
(?!giko)(?!mike)(?=neko) こうですか!? わかりません! …原理はわからないが環境によっては動くな。おいおい勉強しまつorz
[^(foo)]
60 :
デフォルトの名無しさん :2006/09/24(日) 10:55:50
>55 \b(?:(?!giko|mike)\w)+neko とか、どうですか。
([あ-ん]|あっ)*
ワロタ
* ←アナル
* ←アナル ξ←ソフトクリーム MS Pゴシックで見てね1
∧_ ∧ ([あ-ん]|あっ)* (´∀` ) (⊃⌒*⌒⊂) /__ノ''''ヽ__)
<a href='javascript:window.open("
http://hoge/page ","f","width=460,height=400");void(0);'>javascript:window.open</a><br>
のようなリンクを
<a href='
http://hoge/page '>javascript:window.open</a><br>
にするには
Obj.href.replace(/JavaScript:window.open\((\"?|\'?)(.*?)(\"?|\'?),?.*\);?(.*);?/ig,'$2')
ではうまくいきません。
よろしくお願いします。
age
Cソース中の2つのコメントの、「//・・・」と「/*・・・・・*/」を、空白に置き換えることは可能ですか? 置き換えるのは空白一文字ではなく、コメントになっている文字分空白にしたいです
70 :
デフォルトの名無しさん :2006/09/26(火) 23:01:46
$text='</a></b>AIUEO</c>'; $pat='>(.*?)</c>'; if($text=~/$pat/) { print $1."\n"; } else { print "ng\n"; } AIUEOのみ抽出したいのですが、</b>AIUEOが返ってきます。 .*?は最短マッチのはずですが、なぜでしょうか?
>>69 こういう例を考えると正規表現よりCでコード書いた方が早いと思うよ
printf("string//string"); // print
>>70 Perlでは一度成功したらそれでマッチが完了する
最短なのは .* に関してのみ
>([^<>]*)</c>
で望みのマッチをする
73 :
70 :2006/09/27(水) 00:12:15
>>71 >Perlでは一度成功したらそれでマッチが完了する
これは前方から順に一致検索をしているとから、ということですか?
たとえば、
$text='</b></b>AIUEO</c></c>';
$pat='</b>(.*?)</c>';
の場合、$textの先頭側にある</b>と</c>に挟まれた文字列が抽出されてくるから、</b>AIUEOがマッチ。
もし後方から一致検索されていれば、AIUEO</c>がマッチするはずですもんね。
スマートな方法がなさそうなので([^<>]*)にしときます。
ありがとうございました。
>>72 no
#!/usr/bin/perl -p0777 BEGIN { $COMMENT = qr{/\*.*?\*/}; $COMMENT2 = qr{//[^\n]*}; $DOUBLE = qr{\".*?[^\\]\"}; $SINGLE = qr{\'.*?[^\\]\'}; $OTHER = qr{[^"'/]}; } s/($DOUBLE|$SINGLE|$OTHER+)|$COMMENT|$COMMENT2/$1/g; 詳説 正規表現がどっかにいってしまった 添削希望
コメントを除去したいならプリプロセッサに通せば良いと思うんだ
Javaで正規表現を入力チェックに使ってる人って居る? 速度はともかく開発効率がいいから、 決められたライブラリしか使えないときに便利なんだよね
>>74 意外とシンプルにまとまるんだね
リテラルで"string\\"のパターンが来ると内外逆転するかな
やり方はいろいろあるけど qr{"(\\.|[^"])*"} とか
>>76 GUIコンポーネントの入力チェックに使ったことはあるな
ああいうのは手でコーディングするのは苦痛なだけだから。
あと、入力チェックが必要になるようなGUIコンポーネントの場合、
入力は一般的に短いので、速度は問題にならないし
79 :
デフォルトの名無しさん :2006/09/28(木) 07:56:20
ちょっと質問 <aaa> <aaa> <aaa> <aaa> <data1>xxxx</data1> <data2>yyyy</data2> </aaa> </aaa> </aaa> </aaa> こんな文字列があったとして 正規表現つかって一発で一番内側にある<aaa> の内側の文字を取ってくることってできるんだろうか・・・・ 可能か不可能かどうかも想像がつかない・・・orz
81 :
デフォルトの名無しさん :2006/09/28(木) 09:23:50
>>80 横からスマソ
へぇ〜
出来るんだ
これは俺もちょっと興味深い
<aaa>(?!<aaa>)(.*?)</aaa>
XMLを無理やり正規表現で扱うくらいなら 最初からXMLとして扱ったほうが楽なんじゃないの?
長さ優先じゃなくて出現優先にすりゃいいだけだね
>>80 入れ子処理だよね。正規表現第二版だと…
( )の入れ子の場合こうなっているから、
$LevelN = qr/ (?> [^()]+ | \( ??{ $LevelN }) \) )*/x;
えーと………
$LevelN = qr/ (?> [^(<aaa>|<\/aaa>)]+ | <aaa> (??{ $LevelN }) <\/aaa> )*/x;
……(<aaa>|<\/aaa>)の否定ってどうやるんだ?
後は任せた orz
正規言語でない言語を正規表現で扱おうとするのはやめた方がいいんでないかと いや、今の「正規表現」が厳密には正規表現じゃないのは知ってるけど、やっぱり 無理やり拡張したため、無理が出てると思うんだ
別に拡張表現使わなくてもできるけど。 /(<aaa>)*(.*?)<\/aaa>/
バックトラックしまくりそうだけど。一応。 (<aaa>.*)*<aaa>(.*?)<\/aaa> Perlなら、(<aaa>.*?)*<aaa>(.*?)<\/aaa> でもイケた。
>Perlなら、(<aaa>.*?)*<aaa>(.*?)<\/aaa> Perlなら、{(?:<aaa>.*?)*<aaa>(.*?)</aaa>}m
1. Function 2. End Function 3. Exit Function 上記で1だけを検索したい場合どうすればいいでしょうか? ↓ではだめでした (?<!(Exit|End))\s*Function
92 :
デフォルトの名無しさん :2006/09/29(金) 10:39:03
>>80-
>>89 トンクス!
もらった情報でなんとかなったさ〜!
ソフトでガリガリ解析するのがたまらなかったんで・・・
ちなみにXML解析じゃぁないんだけどね(^^;
俺ももっと勉強しなきゃ・・・だなぁ(;´Д`)
もっと頭やわらかくする必要がありそうだorz
>>90 (?:^|[^dt\s]|(?:^|[^n]|(?:^|[^E])n)d|(?:^|[^i]|(?:^|[^x]|(?:^|[^E])x)i)t)\s*Function
オレならFunctionでマッチさせてマッチ位置もらってからEndかExitが前に
ないことを別途調べるな。否定と正規表現は相性悪い。
パーサ書いた方が実装容易で見通しも保守性も拡張性もあって良いような気がする漏れは失格ですかそうですか。
タグ系はXPathでええやん
>>94 俺も同じこと思った。あと、XMLだとそもそも既存のパーサがあるのに
何故それを使わないで正規表現で済まそうとするのかと。あと、ある要素
取り出すだけなら、
>>95 の書いているようにXPath使う手もあるな
アクセスログから検索ワードを抽出するのを試みたいんだけど、 色んな検索エンジンや仕様があって把握しきれません まとめたサイトみたいなものはありませんか
perlの (?{ code }) Perlにおいて、埋め込まれたPerlコードを実行します (??{ code }) Perlにおいて、埋め込まれたPerlコードを実行してその結果を正規表現を表すものとして使用 ができる、windows用の置換ツールってありますか?
何に使うの?
bbbにマッチさせるにはどうすればよいでしょう? ただし、次のように、bbbが<x>と</x>に囲まれている場合は除きます。 また、aaa,bbbは0個以上の任意の文字列とします。 言語はrubyです。 <x>aaabbbccc</x> 自分でやってみた結果はこうです。 /(?!<x>.*)bbb(?!.*<\/x>)/ これでうまくいっているように見えますが、 他に書き方があればよろしくお願いします。
>aaa,bbbは0個以上の任意の文字列とします。 aaa,cccは0個以上の任意の文字列とします。 でしたorz
思うんだがなんで自分でパーサ書かないのかな? XMLだとタグが1行におさまっているとは限らないわけで <x > aaabbbccc </x> とかも考えられるでしょ? そんなのを正規表現でやる方がおかしい
確かにブランクの扱いに特徴のあるものは正規表現に向いてないな。
タグは必ず1行におさまります。個人的に利用してるデータで、XMLとかじゃないんですよ。 なので、実は括弧は目印にすぎませんから、形式は何でもいいんです。 ただ、マッチした部分を括弧で囲みたいわけです。しかし、すでに括弧で囲まれている場合は、 不要なんです。入れ子にしたくないわけです。
require 'html' html = HTMLtokens.new('ファイル名l') html.between("x") { |i| html.tokens[i] = html.tokens[i].gsub(/b+/, 'c') }
まあそれでも<x>aaaa¥<bbb</x>とかではまったりするわけよ 正規表現にふさわしくない題材だと思うね
テンプレサイトに置いてるHTMLパーサ使えば、 広告のカットやテーブル項目の並び替えとかスクリプトからできるんだが。 マニュアルが無いせいなのかな。
XMLを正規表現でやるのはやっつけ仕事の時だけ
正規表現の実装というと、やっぱりPerlが基準になるのか? あまりいいたくはないが、「Perlの正規表現に準拠」ってなるのか。 Perlから正規表現の道に入ったからさ。
POSIXが基準だろ。 漢字が扱えるのでPOSIXなのはboostだと思う。
ふ〜ん。たんくす。
>>109 というか、何でもかんでも正規表現で扱えるわけじゃないというのを
知らない奴が多過ぎる。自分の周りでもXMLのパーサを一生懸命
正規表現で書こうとしてる奴がいたりして、辟易する
汎用的なトーカナイズパーサーが無いからじゃねーの?
XMLパーサはライセンスと段取りのメンドさが問題だろ。 あとWEB上のルールのいいかげんなHTMLの処理も出来ないから、 例えばショップのWEBページから価格を吸い出して XMLに保存という時にも困る。
>>114 Perlの正規表現はPOSIXのそれを超えている。
Perlの正規表現の欠点は ・仕様の合わせ込みが厄介なこと、 ・DFAのエンジンとの親和性が低いこと ・コストの計算が難しいこと(計算量の爆発の予測しにくい) ・最短の一致を見つけるのが遅くなる(ifの条件式とかは別に最短でも成立する) 原因は縦型探索で比較の順序の影響を受けることにある。
c++0xのregexのドラフトには、POSIXの他ECMAScript準拠の正規表現も 盛り込まれてる。 最初の版だとPerl準拠のもあったんだけど、削除されてしまった。
あと、将来的にメニイコアでスレッド立てまくりな環境になった場合、 POSIXだと完全な最長一致だから並列実行で設計できるが Perl式だと互換性のすり合わせが難しくなるだろ。 (最初に見つけた結果で探索を打ち切るのだがその順番が)
>>118-119 やっぱりPerlは詰め込み杉ってところだよね。
最近では、java.util.regex をよく使ってる。
javascriptだとブラウザ対応でどこでも動くから、
javascript の正規表現を知っておくと良さそうだね。
メジャーな実装としては、perl, ruby, javascript (java, c$)ってところかな?
ありがとね〜
>>111 >XMLを正規表現でやるのはやっつけ仕事の時だけ
それって某社の取締役最高技術責任者のこと?
125 :
デフォルトの名無しさん :2006/10/04(水) 13:28:03
0〜100までしか入力できないようにする方法ありますか?
言語を教えろ、言語を。
/^(100|[1-9]\d|\d)$/
if文でゴー!
a-z A-Z 0-9 のように全角記号を始点から終点で指定するには?
>>129 全角記号の定義とエンコードによってまちまちなんでね?
>>131 あとついあったよね、会談。
はずしてやんの。
占星術は統計学なんだから、断言してる時点で詐欺師
>>130 unicode
つか、それぞれのエンコードの定義マップ見たらいいわけ?
136 :
デフォルトの名無しさん :2006/10/11(水) 17:12:53
HTMLのソースから任意の拡張子ファイルにリンクしているサムネイル画像のURLを 取得したいのですが、どういう正規表現で可能でしょうか? 具体的には例えば <a href=xxx.mpg><img src=/image/zzz.jpg></a> このようなものから/image/zzz.jpgを抜き出したいのです。 WEB巡回する用途なので、コロンやらパスやらのフォーマットは 多様なものに対応したいと思っています。言語はPHPです。
迷惑スクレイパー
行の2〜4桁目が3a1以外と3a3以外がある行を見つけるには どのようにしたらいいでしょうか?
grep -v '^.3a[13]'
マッチさせたい文字 aaa xxx bbb マッチさせたくない文字 aaa xxx yyy bbb perlのマルチラインモードで「aaa.*?$^bbb」でいけると思ったのですがだめでした。 上記の条件にあう正規表現を教えてください。
(?<=yyy)bbb
>>141 すいません。
yyybbbにもマッチさせないです。
というか、正規表現のマルチラインで
改行を、$^で指定できないのでしょうか?
改行文字書いちゃえば? /aaa.*¥nbbb/;
一度"\n"でjoinして /aaa([^\n])\nbbb/ でいいんじゃないか?
マッチさせたい文字 aaa xxx bbb マッチさせたくない文字 aaa xxx yyy bbb 無理 bbbはどうすんのさ
なんだ改行ありかよ 否定先読みでも使っとけ
何を前提にしているのかよくわからんが、perlのmは、 ^が改行の直後にもマッチ $が改行の直前にもマッチ するようになるだけ。したがって$^で改行それ自体を指定する ということにはならない。 143のいうように普通に\nとして書け。
if (aaa == bbb) { xxxxxxxxxxxxx xxxxxxxxxxxxx xxxxxxxxxxxxx } xxxの中に、hogeが一切どこにも入らない if () { .... } を検索したいのですが、 perlの正規表現でできますか?
>>149 できない!
M/if[^}]*(?!hoge)}/m
151 :
デフォルトの名無しさん :2006/10/13(金) 21:41:48
<b>(.+?)</b> みたいな正規表現を見かけたのですが、 .+? ってどうして .+ じゃいけないんですかね
>>151 <b>...</b>...<b>...</b>
の外側の<b>〜</b>にマッチしてしまったりするから
153 :
デフォルトの名無しさん :2006/10/14(土) 16:34:24
学び始めたばっかいまいち解っていないのですが、2chのようにhttpが書かれたら
リンクをつけたいのですが、どうしても上手くいきません。
単に正規表現が間違ってるだけかと思われるのですが、
普通、httpにリンクをかける場合どのような正規表現をもちいればいいのでしょうか?
今、phpでpreg_match('/^
http://+[a-zA-Z0-9\.\-\=\/\%\$\?\&\_]$ '、$a)のような
変な書き方をしているですが、どうかよろしければ正しい方法を教えていただけないでしょうか?
>>153 難しくてわからないんだよぉ〜。
どうしてもifから}間での間に文字が入らないの先読み否定がうまくできない・・・
https?://\S+ なんてどうかしら?
157 :
デフォルトの名無しさん :2006/10/15(日) 02:33:45
>>156 www.hoge.comですよ
の ですよ もひっかからね?
>154 googleで「URLの正規表現」を検索すれば
>>157 そういうのは引っかからないで欲しいですよね。
www.hoge.com/search.php?query=ですよ
こゆのは引っかかって欲しいですよね♪
URI(URL)の正規表現なんて、どこまでを通すか通さないのかのさじ加減が難しいのかと思うのですです。
一般的に考えてURLの末尾には改行かスペースが入るだろう。 wikipediaへなんかのリンクだと日本語も使われるので、それは引っ掛けてほしいところ。
161 :
デフォルトの名無しさん :2006/10/16(月) 13:53:14
162 :
デフォルトの名無しさん :2006/10/18(水) 00:01:02
>>159 安易に
https?://[!-~]+[=\?&]?\S+
日本語の前に来る記号にどんな種類があるか知らないけど w
if(/○○○/../□□□/)ってどういう意味?
○○○が含まれるものから、□□□が含まれるものの間は真ってことじゃないのかな?
オライリーの「正規表現」に URLにマッチする正規表現が載ってなかったっけ?
あるけどあんまり好きじゃないな、あのやり方・・・
asdf asdfasdf asdfasdfasdf 一行目の asdf だけに一致させたい場合 どうすればよいのでしょうか?
^asdf$
perlの正規表現で (a|b) と ([ab]) にパフォーマンスの差はありますか? (a|b|c) と ([abc]) の場合はどうでしょう?
>>171 文字クラスで十分なときは文字クラスの方が速いらしいが
気になるならベンチとって確認しろ。
RUBYで、 str = ["<あ>-<#>-<い>--<#>-<1>-<2>-<#>-<x>-<y>"] という形があるとして、 一番後ろの<#>から後ろ(<x>-<y>)を抜き出すにはどうすればいいですか?
str[0].rindex(/<#>-/) && $' str[0].scan(/<.>-<.>/)[-1] str[0].scan(/<#>-([^#]+)\Z/)[0][0]
175 :
173 :2006/10/25(水) 18:56:51
>>174 参考になります。
ありがとうございます。
176 :
デフォルトの名無しさん :2006/10/26(木) 02:20:08
正規表現と聞いて「性器表現」と連想してしまうのは俺だけ??
うん
性器表現・・・どんな演算子があるんだろ。萌
180 :
デフォルトの名無しさん :2006/10/26(木) 16:19:38
preg_match("/docomo\.ne\.jp$/",$host) これでdocomo.ne.jpがひっかからないのですが どうしてでしょうか?
マルチウゼェ。
182 :
180 :2006/10/26(木) 17:01:35
申し訳御座いませんでした。
>>179 *ってよく使うよ。
∧_ ∧
(´∀` )
(⊃⌒*⌒⊂)
/__ノ''''ヽ__)
^[ちま]んこ$
Perlの掲示板スクリプトでタグが入力されたとき、 <em><q>text</em></q> のように要素が重なり合ったときにエラーを返すようにしたいんですが、 どうすればいいか教えていただけませんか?
>>186 かーなーりすれ違い♪
HTML-lintに通すと良いかも♪
"o:\\Desktop\\test\\test1\\ttea\\tarachan.txt" この形式からtarachan.txtの入っているフォルダ名を得るにはどう記述したら良いのでしょう。
自己解決しました。 最良かどうかは解りませんが/(^\".*?\\.*?)[^\\]*?\"/で出来ました。
連投すいません /(^\".*?)[^\\]*?\"/ でも大丈夫なようですね。
_splitpath使った方が早いような。
>>186 念のため聞いておくが、そのような記述が必ずしもHTMLの仕様に逆らってはいないことを知っての上でそうしたいんだな?
linuxのnmap見たいなツールで、windows用のGUIツールありますか? テストサーバでオープンになっているポートを知りたいのですが。
このような正規表現 [a-zA-Z0-9.]+ で アルファベットおよびアルファベット+数字で構成された語句を抜き出し ているのですが、数字だけのものも抜き出してしまいます。 年度など、数字だけで構成されているものを除外するにはどうすればいい でしょうか? どうもうまくいかないもので。よろしくお願いします。
>>194 その正規表現で動いたら奇跡だな。
[a-zA-Z][a-zA-Z0-9.]*
196 :
194 :2006/11/01(水) 18:49:30
>>195 動いてますよ。文字は全て全角なので。(ちょっとわけありで)
その上で、数字だけを除外するにはどうすれば良いのか、お聞きした
いのです。
それだと数字から始まるものはマッチしなくね? [a-zA-Z0-9.]*[a-zA-Z][a-zA-Z0-9.]* こんなのかな
198 :
194 :2006/11/01(水) 19:04:08
>>197 それがマッチするんですよ。こんな感じに
Array ( [0] => 2005 [1] => IEEE1394 [2] => 24 [3] => Index
[4] => Java [5] => API [6] => JMF [7] => USB2.0 )
それで、困っておるわけです。
199 :
デフォルトの名無しさん :2006/11/01(水) 19:17:50
200 :
199 :2006/11/01(水) 19:18:44
202 :
194 :2006/11/01(水) 19:25:35
>>200 195,197の正規表現は試してみましたが、動きませんでした。
PHPのなかで使ってるからだろうか・・?
204 :
194 :2006/11/01(水) 19:33:43
>>197 ご無礼をいたしました。普通に動きました。ありがとうございます。
205 :
194 :2006/11/01(水) 19:42:14
あと、後学のために、[a-zA-Z]と[a-zA-Z0-9.]がくっついた状態は どんな意味があるのか、教えていただけるとありがたいのですが
>>203 [] の中なんだから、エスケープの必要はないっしょ。
世の中には記号類と見ればやたらエスケープしたがる人がいるのはよく見るが。
文字列から括弧内(とその括弧)を消去する方法で悩んでいます。 $string = "(foo1)bar1 (foo2 bar2(foo3))bar3((foo4) bar4)"; echo preg_replace(pattern, "", $string); この例で「bar1 bar3」の出力を期待しますが /\(.+\)/ なら当然何も残りません。非欲張りの /\(.+?\)/ では入れ子の 部分でおかしくなって「bar1 )bar3 bar4)」となります。 どうかお知恵をお貸しください。
$string = "(foo1)bar1 (foo2 bar2(foo3))bar3((foo4) bar4)"; while ($string =~ s/\([^(]*?\)//g) {} print $string;
211 :
208 :2006/11/04(土) 12:36:54
レスありがとうございます。 ややこしそうなんで不等号に置換してstrip_tagsします。
スレを全く読まずに質問 PerlでURLの書式として正しいか、URLとして使用できない文字が含まれていないかをチェックする正規表現教えて 日本語ドメインには対応しなくていいから
正規表現の事が全くわからないので教えてほしいのですが 2ちゃんねるのBEの表記を正規表現で表すとどうなるのでしょうか?
>214 >1のリンク先くらい嫁
質問ですが、perlでまちBBSのスレをdat化させたいと思って正規表現でやろうとしたんですが出来ません。 htmltodatに入ってる『m/<dt>([0-9]+).+?(?:"mailto:(.+?)">)?<b> (.*?) </b>.*?投稿日: (.*?)<br><dd> ?(.*)<br><br>/mi』じゃダメなんですか?
>>216 まちBBSの書式なんか知らん。
befor-afterのサンプルぐらい出せ。
まちBBSに書き込みしたらIPと住んでる地域バレるじゃん
東京23区板は出ないよ
220 :
216 :2006/11/12(日) 09:30:35
befor 『<dt>149 名前:<a href="mailto:sage"><b> 東京都名無区 </B></a> 投稿日: 2006/11/08(水) 10:26:08 ID:4jNjzvOE<br><dd> 白山ラーメンは営業時間がちょっとね。 <br><br> <dt>150 名前:<font color="#008800"><b> 東京都名無区 </b></font> 投稿日: 2006/11/08(水) 19:20:35 ID:xKWAFsLU<br><dd> じゃあ素材は中国産か・・。 <br><br>』 after 『東京都名無区<>sage<>2006/11/08(水) 10:26:08 ID:4jNjzvOE<>白山ラーメンは営業時間がちょっとね。 <> 東京都名無区<><>2006/11/08(水) 19:20:35 ID:xKWAFsLU<>じゃあ素材は中国産か・・。 <>』 こういう感じにしたいんです。
同じ文字が3個以上続いている行を表示するにはどうしたらいいですか?
>>221 grepでピリオドとbackreferenceを使ってちょ。
/(.)\1\1/
224 :
デフォルトの名無しさん :2006/11/15(水) 00:09:45
regular expressionを「正規表現」って訳した奴は氏ね! どう考えても「規則表現」あたりだろーが。 それに「せいきひょうげん」とか口に出して言うのって なんか恥ずかしいじゃねーか。
>>224 どう考えても
考えないで「勉強」してよ。
共立のエイホウルマン本では「正則表現」と訳されてますがな。
性器表現((゚)) Ψ
MacやMACやMaC OSXやmac osXにはヒットしても macafeeやMacAfeeにはヒットしない正規表現はどう書けばよいのでしょうか。
/\bmac\b/i
正規表現で置換しまくりんぐフヒヒ
重くなりそう
234 :
デフォルトの名無しさん :2006/11/21(火) 13:00:04
すいません。ちょっと探しても見つからなかったのですが、 [AaAa][IiIi][UuUu] という正規表現を分解して、マッチする文字列を出してくれるツール、 もしくはC#あたりでそういった方法などは無いでしょうか?
>>234 *とかあったらどうすんのさ。
本当に正規表現関連の質問なのか?
組み合わせ論の話なんじゃ?
>>235 *とかはありません。
[Aa]のパターンだけなんですが、如何せん量が多くて
自分で分解して1つ1つ書いていくのは不可能なのです。
何か良い方法は無いか探してるんですが・・・
正規表現のままでいけない理由は?
あったけどサイトごと消失
4進数3桁
240 :
234 :2006/11/21(火) 17:06:08
>>237 リストを渡す相手が正規表現を知らず、全部並べて書いてくれと言われまして……
ワロスw
正規表現を教えた方が早そうだな
ご愁傷様としか言いようがない。
244 :
234 :2006/11/21(火) 19:42:25
人生オワタ\(^o^)/
数式の展開と同様だよね。
Maxima 5.9.1
http://maxima.sourceforge.net Using Lisp Kyoto Common Lisp GCL 2.6.5 (aka GCL)
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
This is a development version of Maxima. The function bug_report()
provides bug reporting information.
(%i1) expand((a1+a2+a3+a4)*(i1+i2+i3+i4)*(u1+u2+u3+u4));
(%o1) A4 i4 u4 + A3 i4 u4 + A2 i4 u4 + A1 i4 u4 + A4 i3 u4 + A3 i3 u4
+ A2 i3 u4 + A1 i3 u4 + A4 i2 u4 + A3 i2 u4 + A2 i2 u4 + A1 i2 u4 + A4 I1 u4
+ A3 I1 u4 + A2 I1 u4 + A1 I1 u4 + A4 i4 u3 + A3 i4 u3 + A2 i4 u3 + A1 i4 u3
+ A4 i3 u3 + A3 i3 u3 + A2 i3 u3 + A1 i3 u3 + A4 i2 u3 + A3 i2 u3 + A2 i2 u3
+ A1 i2 u3 + A4 I1 u3 + A3 I1 u3 + A2 I1 u3 + A1 I1 u3 + A4 i4 u2 + A3 i4 u2
+ A2 i4 u2 + A1 i4 u2 + A4 i3 u2 + A3 i3 u2 + A2 i3 u2 + A1 i3 u2 + A4 i2 u2
+ A3 i2 u2 + A2 i2 u2 + A1 i2 u2 + A4 I1 u2 + A3 I1 u2 + A2 I1 u2 + A1 I1 u2
+ A4 i4 u1 + A3 i4 u1 + A2 i4 u1 + A1 i4 u1 + A4 i3 u1 + A3 i3 u1 + A2 i3 u1
+ A1 i3 u1 + A4 i2 u1 + A3 i2 u1 + A2 i2 u1 + A1 i2 u1 + A4 I1 u1 + A3 I1 u1
+ A2 I1 u1 + A1 I1 u1
(%i2)
文字化けしたらすまん。 aa1="A a $(B#A(B $(B#a(B";aa2="I i $(B#I(B $(B#i(B";aa3="U u $(B#U(B $(B#u(B"; for bb1 in $aa1; do for bb2 in $aa2; do for bb3 in $aa3; do echo $bb1$bb2$bb3; done; done; done
どうでもいいけど、絨毯爆撃テストに頼ってるだけじゃ条件漏れでそのうち嵌るよ。
>>234 文字の範囲が決まってる(アルファベットだけとか)なら、
全組み合わせのテキストファイル生成して、
エディタで引っ掛けるなりgrepするなりするってのはどう?
>>248 だからその
>全組み合わせのテキストファイル生成
してくれるツールは無いかって聞いてるんじゃん。
って、正規表現わからないから、って言われてるのか。 ならやるべきことはリストで出すことじゃなくて、 今の正規表現を図か何かにわかりやすく起こして 説明してわかってもらうことじゃないの?
>>249 ああ、いや、例えばアルファベット小文字10文字って決まってたら
aaaaaaaaaaからzzzzzzzzzzまで全部テキストファイルに書いて
引っ掛ける、ってな意味。限定されてないと無理だけど。
>>251 だからその全パターンを正規表現からおこして列挙してくれるツ(ry
vbs だけど... コマンドプロンプトから cscript xxx.vbs ってやってちょ --- xxx.vbs Option Explicit Dim X X = "[AaAa][IiIi][UuUu]" With New RegExp .Global = True .Pattern = "\[([^\]]*)\]" Dim Matches Set Matches = .Execute(X) Call Foo(Matches, 0, "") End With Private Sub Foo(Matches, Level, String) If Level < Matches.Count Then Dim S S = Matches.Item(Level).SubMatches(0) Dim I For I = 1 To Len(S) Call Foo(Matches, Level + 1, String + Mid(S, I, 1)) Next Else WScript.StdOut.WriteLine String End If End Sub
そんなにニーズあるのなら年末にでも開発するけど ダウンロード一桁とかじゃないだろうな(w
254氏キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
頑張ってつくったところで サイズがでかすぎるテキストファイルになって 重くて相手にされない予感
[^a] とか入って来たら死にそうな感じがするが
死なない。そういうのをちゃんと扱えて 事前に計算量を予測できる、 UTF-8でも大丈夫なアルゴリズムがあるの。
[01]を100個ぐらい並べただけで相当な数になるわけだが。
なるけどそれを予測できればいいわけ。 1000超えたら中止とか設定するの。
261 :
デフォルトの名無しさん :2006/11/22(水) 20:00:10
それなんて注文の多い料理店。 組み合わせだすなんて不毛なことより どっちかというと視覚化のほうをやりたい。
正規表現で結婚相手を見つけるにはどうしたらいいですか?
*女
性器表現するにはどうしたらいいですか?
お?(ちん(ちん|ぽこ?|こ)|(まん|め)こ)
ぼぼが表現されんようだが
申し訳ありませんが、方言につきましては別途料金が発生いたします。 よろしいでしょうか?
OK キャンセル いいから一発やらせろよ
∧_∧ / ̄ ̄ ̄ ̄ ̄ ( ´∀`)< 問題:「同じ数の繰り返しがない数字列すべて」を示す正規表現は? ( ) \_____ | | | (__)_)
そうやって知りたいだけじゃねーか。 ちったぁ自分で考えろや
同じ数の繰り返しがないって意味わかんない
grep -v "\(.\)\1" ?
>>273 同じ数字が隣にこない、と言えばいいだろうか
113はダメ、131はおk
>>275 全部です。数字一個の列も数字百個の列も表現できろってことです。
俺のまわりの連中は馬鹿だから誰もわかりません
勿論俺もわかりません
(\d)(?!\1)
ああ、列ってのは連なりってことなのかな。 だとしたらこうか。 ((\d)(?!\1))+
違うわ。こうか。 ((\d)(?!\2)){2,}
282 :
デフォルトの名無しさん :2006/11/25(土) 20:26:05
ダメって言うなら正規表現書いてみろ
これだけ偉そうなんだから、きっとずばっと正解書いてくれるよ
オライリーの本を読めば正解が分かる ヒントは ?!
VBS だが ----- Option Explicit Dim X, R For Each X In Array("1", "113", "131", "987654321", "1", "98", "988", "678678") With New RegExp .Pattern = "^(?:(\d)(?!\1))*$" If .Test(X) Then R = "Match" Else R = "Not Match" End If WScript.StdOut.WriteLine X & ": " & R End With Next ----- 1: Match 113: Not Match 131: Match 987654321: Match 1: Match 98: Match 988: Not Match 678678: Match
>>281 ○987654321
○1
○98
×988
○678678
この正規表現を連接・選択・スターだけで書けって言うんだ…
無茶しやがって
ヒント 同じ数字が連続するのは10種類しかない
123123もダメな事になりました
>>286 オライリーの本を読めば正解が分かるな
ヒントは否定先読み
>>1 のリンク先を全て読んでもいいけどな
ちょっと流れからはずれるんだが、疑問に思ったこと Perl5など最近の言語処理系がサポートしているいわゆる正規表現が既に 本来の意味での正規表現ではなくなっているというのは有名な話だけど じゃあ、そのいわゆる正規表現が表現できる言語のクラスってどんなの なんだろう?色んなところの例を見た限りでは、少なくとも文脈自由言語の 一部を表現できるようだけど
文脈自由文法は表現できるよ。 だから自然言語処理で、正規表現がよく使われたりする。
>>291 つまり、「任意の」文脈自由文法をPerl5などで拡張された「いわゆる」正規表現
で表現できるってこと?もしそうだったら、どっかにそれを証明した論文がある
はずなんだけど論文へのポインタか何か知ってたら教えて
[00:00.00] [00:08.05] [00:20.32] こんなのを [00:00] [00:08] [00:20] に書き換える正規表現教えてください
書き換える作業は各自でお願いします。
s/\(\[.....\)...]/\1]/ s/\(\[[0-9][0-9]:[0-9][0-9]\)\.[0-9][0-9]]/\1]/
296 :
293 :2006/12/06(水) 17:36:11
297 :
デフォルトの名無しさん :2006/12/07(木) 00:53:22
aaabbbccc と bbb を取りたい 括弧の中に括弧っていいんですか? /(aaa(bbb)ccc)/
かっこわるいー
299 :
デフォルトの名無しさん :2006/12/07(木) 03:42:49
(e)
>>291 balanced parenthesesは拡張された正規表現でどう書くの?
>>300 perlの正規表現のマニュアルの (??{ code }) のところにそのものずばりの例がある。
$re = qr{
\(
(?:
(?> [^()]+ )# Non-parens without backtracking
|
(??{ $re })# Group with matching parens
)*
\)
}x;
ttp://perldoc.perl.org/perlre.html
>>301 \(
(?:
(?> [^()]+ )# Non-parens without backtracking
|
(??{ $re })# Group with matching parens
)*
\)
は(??{ code })でコードが埋め込まれることで言語依存になってしまうが
拡張された正規表現ではある。しかしその外側は正規表現ではないのでは?
単なるperlの文に見えるのだが。
>>300 こーゆーのもある(,NETね)
Regex re = new Regex(@"^
(?>
\( (?<LEVEL>) # On opening paren push level
|
\) (?<-LEVEL>) # On closing paren pop level
|
(?! \( | \) ) . # Match any char except ( or )
)+
(?(LEVEL)(?!)) # If level exists then fail
$", RegexOptions.IgnorePatternWhitespace);
HTMLを取得してタグをすべて除去するperlスクリプトを書いているんですが、 javascriptだけは残ってしまいます。 正規表現でjavascriptを消去するやり方はないんでしょうか? 色々試してもさっぱりダメ……
scriptの開始タグ〜終了タグを除去すればいい
HTMLタグ除去って perldoc 見れば一発だし 行儀よく <!-- hoge --> に囲まれてれば JavaScript だって一緒に消されるっしょ? うまいことコメントアウトされてないようなら 先に script 回りだけ同じようにばっさり切ればいいし
もうだめなんだよ
>>305 まあ、君の言うことは正しいんだけど、その「終了タグ」を
見つけるのが大変と言うことだ。
文字列やコメント中に </script> とか書いてるのをきちんと
はじくのはちょっと骨が折れる。
Fx1.5からはE4Xがあるから、粉砕骨折するだろうね。
亀裂骨折はこの間したけどな いてえよ
HTMLのタグ除去に似ているのですが今HTMLタグ以外の部分を(.*?)に置き換える正規表現をjavaで考えています. 判りにくいと思いますので例を言うと <font><a href="(.*?)" target="_blank">Recycled Niceguys</a></font color="red"> <font><a href="(.*?)" target="_blank">(.*?)</a></font color="red"> こんな感じに変換にしたいのです. 今自分で考えたのは ((?:<.*?>)*)(?:.*?)((?:<.*?>)*) group(1) + "(.*?)" + group(2) こうなのですがうまく変換できません. 何処が間違っているのでしょうか? ご教授お願いします.
タグの定義が分からない value = ">" を考慮するかとか書いてないし よって回答不能
終了タグに属性書くのはかなりレベル高いボケだなw
<input name=dir value=">">
316 :
デフォルトの名無しさん :2006/12/16(土) 02:22:56
PHPです URLの test.php?a=123&b=456 から a が欲しいので /a\=(.+?)\&/ としていたのですが、test.php?a=123 だけで終わる場合があることが分かったのですが、 &または行末としたいのですが、 /a\=(.+?)[\&$]/ では行末の場合ヒットしてくれません ご教授願えないでしょうか?
/a\=(.+?)(\&)?/ じゃ駄目なの?
>>316 PHPなら
$_GET["a"]
じゃあかんの?
test
どなたかご指導お願いします。 Flashで読み込む用に、 kuji=***(ランダムで変わる大吉から凶まで) という文字列だけを出力するkuji.phpを作りました。 さらに、この***の部分だけをmain.phpに読み込んで ランダムで変わる部分だけを表示したいのですが、 include('kuji.php'); で読み込んだあと、「kuji=」の部分を削って***だけ表示するには どのようにすれば良いのでしょうか?PHPのバージョンは4.0.6です。
それは正規表現使わない方が良いと思うんです。
324 :
デフォルトの名無しさん :2006/12/25(月) 22:14:59
正規表現でand検索ってどうやるんだっけ? 「ジョージアのコーヒー」 「コーヒーはジョージア」 で 「コーヒー」「ジョージア」 だけを使って2文にマッチさせたい。 ジョージア.*コーヒー だと1文目はヒットするが、2文目はヒットしない。
m#(コーヒー)|(ジョージア)# ではなくって?釣り?
あらやだ(照)∧||∧
327 :
デフォルトの名無しさん :2006/12/25(月) 23:26:43
んーどちらか一方ではなくて、2つの条件を満たしてマッチさせたいわけです。 たとえば 「ジョージアのコーヒー美味しいね。」 「ジョージアよりポッカの方が良い。」 という場合もあった場合に、一つ目だけをマッチさせて、二つ目を省きたいのです。 検索条件のand検索の様な事はできるのかなと思って質問しました。
328 :
デフォルトの名無しさん :2006/12/25(月) 23:29:12
という場合もあった場合に、一つ目だけをマッチさせて、二つ目を省きたいのです。 ↓ という場合もあった場合に、一文目だけをマッチさせて、二文目を省きたいのです。
>>327 基本的には組み合わせの数だけorでつなぐ正規表現になると思う
例えばこんな感じで
(ジョージア.*コーヒー|コーヒー.*ジョージア)
330 :
デフォルトの名無しさん :2006/12/26(火) 01:21:40
そうですか・・・。 正規表現でスマートに実装できるかなと思ったのですが。 単語が3個4個と増えてくると結構コードが汚くなってきますよね。 とりあえず今は仕様ということで諦めるしかない様ですね。
名前つきキャプチャとかで、「どれがマッチしたか」が分かる言語なら 325みたくorでマッチさせておいて、その後に「全部マッチしたやつ」を 探せばいいのでは
(?=.*ジョージア)(?=.*コーヒー).*
すみません教えて下さい ---- ABCD こんにちは こんばんわ さようなら EFGH ---- 上のABCDとEFGHに挟まれる複数行の文字列を 取得するには、どのような記述にしたら 良いでしょうか?
SQLの ...where ID like 'EE%' and ID <> 'EEXX' という条件を正規表現でやろうと思います。 エディタの正規表現検索で確認した感じだと「^(?!EEXX)EE.*$」でいけそうなんですけど、 大丈夫でしょうか?
>>332 これでいいんだ...。orz
どうも肯定先読みの説明ってどこ見ても意味がとりにくい。
どっかにすっきりした解説がないもんだろうか。
338 :
デフォルトの名無しさん :2006/12/28(木) 23:20:02
>>339 ”ホ”の前に”>”を入れたいんじゃないのかな?
342 :
デフォルトの名無しさん :2006/12/29(金) 01:46:58
理由は不明ですが、解決しました。ありがとうございました。
これは裏政府の暗号に違いないっ!
秀丸の正規表現なんですが hogehoge::と書いた時に「::」より前だけヒットさせる正規表現は.*(?=::)と 書いてうまくいっていますが、↑と別に hogehoge:だけヒットさせるには何と書けばいいのでしょうか? 一応.*(?=:{1})で試したらhogehoge::にも引っかかってしまいますた
>>344 hogehoge: は引っ掛けたいけど hogehoge:: ははじけばいいの?
hogehoge(?=:[^:])
でどう?
>>337 そんなにわかりづらいか?
マッチを試みてその結果はあとに影響するけど、注目位置は変えないって
ことだけだと思うんだけど。
>>345 ありがとう!
> hogehoge: は引っ掛けたいけど hogehoge:: ははじけばいいの?
そうなんです。ですがhogehoge(?=:[^:])だとhogehoge:にも引っかかりませんでした…
あと試したのが↓で、hogehoge::とhogehoge:両方に引っかかってしまいました
.*(?=:(?!:))
難しい・・・他にイイ案はありますでしょうか?
348 :
345 :2006/12/30(土) 13:53:19
>>347 条件見てC++のソースでも食わせると思ったのだけど違うのかな?
345の条件だと、hogehoge: の':' で行が終わるとマッチしないよ。
hogehoge(?=:(?:[^:]*$))
でどうだろう。
> .*(?=:(?!:))
これだと.*が一個目の:を飲み込んじゃうのを許しちゃうよ。
hogehogeに固定の文字列じゃなくて何らかの正規表現を置きたいなら、
hogehoge部分にコロンがこないという前提を置いていいなら、
[^:]*(?=:(?:[^:]*$))
かな。
いずれにしろ今回だめだというなら条件をもう少し詳しく提示してね。
どうも有難うございます! 2つとも 「正規表現での'|'の前後の文字が無いかまたは + * ? の直前に文字がありません」 というエラーが出て登録できませんでした プログラミングから縁遠い者がAutohotkeyのスクリプトを書いております エディタは秀丸を使っているのでスクリプトを所々強調表示したいなーと思い Hotkey::(コロン2つ)とLabel:(コロン1つ)を別々にヒットさせたいんです
350 :
345 :2006/12/30(土) 16:04:51
>>349 Autohotkeyも秀丸も使ってないので試せないのだけど(秀丸は昔は使っていた)、
Perlではちゃんとうごいってるっぽいんだけどねえ。
でもちょっと勘違いして変な記述をしていたので直してみた
[^:]+(?=:[^:]*$)
あとエラーメッセージは秀丸の?
あとでインスコして試してみるけど、打ち間違いってことはない?
期待しないところでマッチするのはあってもエラーはないと思うんだけどなあ
>>346 「その結果はあとに影響する」と言うのがいまいちピンとこない。
でも今まで見た中では一番よくわかる解説だと思う。
[よくない例]
perlreref:
(?=...) ゼロ幅の肯定先読み表明
Microsoft VBScript の RegExp の説明:
肯定先読みを実行する部分式です。
pattern に一致する文字列が始まる位置にある検索文字列と一致します。
一致した文字列は記憶されず、後で使用することはできません。
たとえば "Windows (?=95|98|NT|2000)" は、"Windows 2000" の "Windows"
には一致しますが、"Windows 3.1" の "Windows" には一致しません。
先読み処理では、読み進まれた文字は処理済みとは見なされません。
一致の検出後、次の検索処理は先読みされた文字列の後からではなく、
一致文字列のすぐ後から開始されます。
こんな説明にみんなちゃんと理解できてるの?
>>350 それでできました!ありがとうござます!
>あとエラーメッセージは秀丸の?
そうです。コピペでやってるんですが
>>348 だと登録時にエラー出ました
>>350 で完璧です!今から意味を理解してみますw
マッチするかどうかの判定には使われるけど、その部分はマッチしない。
354 :
346 :2006/12/30(土) 16:57:46
>>351 んーとね、「結果があとに影響する」というのは
(?=foo).*
マッチを試みるやり方は先読みでないときと同じでマッチに成功したか失敗したかで
その先に進むかどうかが決まる。マッチした部分は保存しないし、注目位置は変化しない
というつもりだったんだけど。
>こんな説明にみんなちゃんと理解できてるの?
説明で理解したってかどちらかというと実際に使ってみてどういう動きをするかで
覚えた感じかなあ。
最初のPerlで実装されたときから使ってるから、ほかの言語での説明はあまり気にしなかったよ。
355 :
345 :2006/12/30(土) 17:01:27
>>352 秀丸で348のパターンがエラーになるのは確認した。
なんでこんなメッセージになるのかよくわからんがw
>>355 重ね重ねすみません!
あちこちヒットしてしまうようになったのでw
Label:(行末)
だけにヒットするにはどうしたらいいんでしょう・・
秀丸ヘルプを引きながら理解しようとしてますが
[^:]+(?=:[^:]*$)←自分がいじるとことごとく失敗します
Label:$
…_| ̄|○ 一応試したのがこれですw [^:]+(?=:[^:]*{0}$)
360 :
345 :2006/12/30(土) 23:58:33
>>356 AutoHotKeyとやらの解説ページ見たんだけどさ、要は
コロン一つだけのラベル行と、キー定義のコロン二つを見分けたいってこと?
解説ページの記述によればコロン一つの行はラベルとコロンで行が終わってなければ
いけないようなことが書いてるから、357にあるように
^[^:]*;$
にしといて、コロン二つのほうは行のいろんなところに使えるみたいだけど行頭だけに絞るなら
^[^ ]*::
くらいににしとけば?
ラベル名は多分アルファベットだけで記号は使えないような気がするのでその辺で
絞ってもいいけど。
ピンポイントで解決したいこと書くより最終的に何をしたいのかを書いたほうが
いいアドバイスをもらいやすいってのはあると思うよ。
>>354 詳しい説明ありがとう。
大体理解できた
...と思う。m(_._)m
>>359-360 345さん!シンプルに^[^:]*:$と^[^ ]*::で登録しました
>コロン一つだけのラベル行と、キー定義のコロン二つを見分けたいってこと?
そうなんです。説明足らずですみません
よくばりマッチも勉強します
[^:]+(?=:[^:]*$)もなんとか理解できたと思いますw
本当にありがとうございました!感謝感謝です
363 :
デフォルトの名無しさん :2007/01/01(月) 21:13:05
PHPを使っています。 &を&におきかえたいんですけど、 今のところ、&を&に置き換えるという単純なことをしています。 ただこれだと、 &という入力があったら、&という風になってしまいます。 他の実態参照(&文字列;)も、同じようになってしまうので困っています。 正規表現でどのように表現したらよいのでしょうか? やりたいことは、&を検索したいのですが、 & " <などの実態参照は除外したいです。
364 :
363 :2007/01/01(月) 21:14:30
すみません。書き直します。 PHPを使っています。 &を&amp;におきかえたいんですけど、 今のところ、&を&amp;に置き換えるという単純なことをしています。 ただこれだと、 &amp;という入力があったら、&amp;amp;という風になってしまいます。 他の実態参照(&文字列;)も、同じようになってしまうので困っています。 正規表現でどのように表現したらよいのでしょうか? やりたいことは、&を検索したいのですが、 &amp; &quot; &lt;などの実態参照は除外したいです。
>>364 &amp;を&に置き換えた後&を&amp;におきかえれば?
&amp;を&に置き換えてそのあと&を&amp;に置き換えるとか
かぶったー
&&
これでどうだ? &
370 :
363 :2007/01/01(月) 21:44:30
>>365-366 ありがとうございます。
早速やってみたところ、&amp;は思い通りになりました。
しかし、他の実体参照文字(&quot;等)では、
&amp;quote;という風になってしまいますorz
if (!変数 =&amp;) { &を&amp;に置き換える }
372 :
363 :2007/01/01(月) 21:48:12
と思いましたけど・・・ &amp;quot;でも表示上は一緒でしたね。 " どうも皆様ありがとうございました!
まあ、解決したみたいだから何よりなんだけど、 そもそも & と & が混在していると 言う設計がおかしいのではないの?
374 :
デフォルトの名無しさん :2007/01/03(水) 13:35:53
PHPの置き換え処理で、文字列があったら、その文字列に置き換える (つまり同じ文字列を出力する) ということをしたいのですが、マッチした文字列をどう表現すればいいのかわかりません。 ereg_replace(".*", ".*", $str); というようなことをしたいのですが、 第2パラメータをどう書けばいいのかわかりません。 上の例だと、そのまま.*という文字列が出力されてしまいます。 どなたかお助けください。
preg_replace("/(.*)/", "\\1", $str); 動くかはしらん
376 :
デフォルトの名無しさん :2007/01/03(水) 14:21:13
>>375 見事できました!
実は置き換え対象で\\1を指定したのに置き換えられなくて、
悩んでいたのですが、()で囲む必要があったんですね。
勉強になりました。どうもありがとうございました。
377 :
デフォルトの名無しさん :2007/01/10(水) 11:49:44
最近 「字句解析処理系の生成ツール flex」 というのを知ったんだけど C言語から使う場合 regex.h とどっちが早いの? regex.h 遅いってイメージがあるんだけど・・・
378 :
377 :2007/01/10(水) 13:17:48
勘違いしてました。ごめんなさい
↑誰だよオマエ
ORACLE10gのREGEXP_LIKEを使っています。 訳あってOR、ANDを正規表現で行っています SELECT * FROM TEST WHERE REGEXP_LIKE(text,'(あいう)|(ABC)|(xyz)') 上のSQLであいうまたはABCまたはxyzというOR検索は可能ですが AND検索の正規表現がどうしてもできません。 知恵をかしてください。
381 :
デフォルトの名無しさん :2007/01/13(土) 16:08:13
PHPのpreg_matchでの質問です。 $template_src = preg_replace("/\\\[/","[",$template_src); 上のように、データ内に存在する\[を、ただの[へ置換したいのですが、 Compilation failed: missing terminating ] for character class at offset 3 という警告が出てしまいます。 自分では、\\で\として扱われているのかが怪しいと感じているのですが・・ これはどのようにすれば解決できるのでしょうか? ご教授下さいませ。
preg_replace('/\[/',"[",$template_src)
383 :
381 :2007/01/13(土) 16:23:51
>>382 $hoge = '\[hoge\]';
$hoge = preg_replace('/\[/',"[",$hoge);
echo $hoge;
\[hoge\]が出力されてしまいます。
シングルクオートで囲んでも、\[はただの[として認識されているようです。
または、私何か間違った認識をしているのでしょうか・・?
>>383 preg_replace('/\x2F\[/', '[', $hoge);
385 :
381 :2007/01/13(土) 16:34:07
\\\\で\を表現するそうです。 笑ってください。 ありがとうございました。
386 :
デフォルトの名無しさん :2007/01/14(日) 01:09:06
複数のパターンを含まない正規表現はどう記述すれば良いのでしょうか。
388 :
386 :2007/01/14(日) 14:41:08
>>387 /\[([a-zA-Z]+)\]/ と /\[\/$1\]/ に挟まれていて、尚且つ /<br \/>/ と /\[\/?[a-zA-Z]+\]/ を含まないパターン、などです。
/\[([a-zA-Z]+)\](?:(?!<br \/>)(?!\[\/?[a-zA-Z]+\]).)*\[\/$1\]/
かと思ったのですが、違うようなのです。
無理して正規表現一本でやろうとしなくてもいいんじゃないかな
390 :
デフォルトの名無しさん :2007/01/17(水) 15:53:02
392 :
デフォルトの名無しさん :2007/01/23(火) 11:17:31
(^u^n^k^o)*
394 :
デフォルトの名無しさん :2007/01/23(火) 12:40:12
/(^o^)/ って何にもヒットしないんだな。オワタ
正規っていう言葉は傲慢だ! こんなセンスの無い表現を勝手に正規あつかいするな!
「面倒くさがりのためのセンスの無い表現」 とか、 「紙面のスペース上都合の良い表現」とかに変えろ!
401 :
デフォルトの名無しさん :2007/01/27(土) 12:50:50
秀丸で置換をしているのですが abc= def= ghi= … を abc=abc def=def ghi=ghi … とするにはどういった正規表現で置換すればいいのでしょうか?
>>401 (.+?)= → \1=\1
でいいんじゃね?
404 :
デフォルトの名無しさん :2007/01/28(日) 11:19:30
正規表現ってのを勉強したいんですが、最も一般的なのはどこの正規表現なんですか?
>>404 perlかsedが手ごろ。Windowsでも入手できるよ。
406 :
デフォルトの名無しさん :2007/01/28(日) 11:57:42
いや、文法は検索して勉強からするからいいんですけど、 正規表現って環境によって色々種類があるみたいで、 どれを勉強すればいいかわからない・・・。 一番スタンダートとされてるものは、grepなんですか?
Perl5互換のものが多いかと。
いいえ。
メジャーなのではegrepが一番セオリーに忠実だと思う。 世間じゃPerl式が主流でもう正規表現の範疇から外れまくってる。
とりあえずperl互換モードがなければ駄目エンジン決定だからな
そんなにPerl式っていいのか? lexやegrepと動き違うし、エンジンごとの挙動もぴったり合わなくなるし 使ってて感覚的に不正確なんだが(それが正しくても人間の感覚とズレるから)。
俺の感覚にも合わん。>perl式 俺的に、かなりの場面で、egrep程度の能力+プログラムコードの方がわかりやすい。 もちろんそうでない場面も多少はあるだろうが、あれだけ拡張する必要はなかったろう。
Perl式とegrep式ってどの辺が違うの? 最短一致の?とか、(?…)系のとこだけかな?
egrepは常にパターン全体で最長の一致をとるけど、 perlは適当なところで中断して結果を返す仕様。 perlは深さ優先探索で枝刈りって制約をうけるから、 プログラム的な設計の自由度が全然なくてDFAとか使えない。
駄目とか使えないとか じゃあなくって perl式は世のデファクトだからなぁ 正しいとか正しくないとか関係ない
>>414 んと、世間でよくいう「PPerl 5互換」というのはものぐさマッチ(最短マッチ)などの
表記上の拡張を受け付けるかどうかという観点でいってるんじゃないかな。
枝刈りだのなんだのまで考えて「互換仕様」にしているdeveloperはいないんじゃかろうか?
もちろん、理屈の上でperlと同じようにしないと実装できないというのは
おいといてね。
斜め読みなんで勘違いしているかもしれないけど、perl 6の rule だと
DFAで解釈できるところはDFA作ってマッチングを行うとかあったような。
まあもはやアレは「正規表現」じゃないが。
417 :
デフォルトの名無しさん :2007/01/29(月) 01:34:35
ちょんまげは性器表現
妹「ああもう沢山。この兄と来たら陰茎の事ばかり。 得意げな顔をして髷を動かしている。こんな兄の血を引く自分が憎い」 妹「卑猥にすぎる。日本はどうなってしまうのか」
オラ難しいことはわかんねーだが 最短一致てのが使えるってーことを知ったとき 「こりゃ便利だべ!」と思ったべさ
専門板らしくなってきたのに。
422 :
デフォルトの名無しさん :2007/01/30(火) 02:33:54
血縁は兄の子だけど、登録は兄の妹になってるだけじゃね?
正規表現で説明して
javascriptの正規表現なのですが、 /\/ads?[./]/ /\.ads?\// を上手く組み合わせられませんか? /[,/]ads?[./]/ だと \.ads?\. もマッチしてしまうので、 これを除外したいのですが……。
/\/ads?[./]|\.ads?\//
427 :
デフォルトの名無しさん :2007/02/07(水) 14:01:14
「普通のエディタ」ってメモ帳か?
>>428 自分が今使用しているのはサクラエディタです。
じゃ、そちらのスレでどうぞ
431 :
デフォルトの名無しさん :2007/02/08(木) 03:18:39
行末から一番近い位置のある文字から行末まで削除したいのですが 分かりません(行頭からというのは出来るようになりました) kome!kame! の最後からkを探してそこから削除して kome! だけを残したいです よろしくお願いいたします
432 :
kome!kame! :2007/02/08(木) 06:21:48
test
echo 'kome!kame!' |sed -e "s/\(.*\)k[^k]*$/\1/"
kome!
{}の間の、改行のみの行、を正規表現で削除したいのですが、どうなるでしょうか? 例えば、 ----------------- { hoge } { } ----------------------- の場合、 ----------------------- { hoge } { } ----------------------- にしたいと考えています。 phpのpreg_replaceを利用するつもりです。 おながいします orz
436 :
デフォルトの名無しさん :2007/02/09(金) 10:04:17
MovableTypeのプラグインで、BANASCIIという、 ラテン文字のみのトラックバックを禁止するものがあるのですが、 それと同じ正規表現をPHPに使いたいと思い、 ソースを見たのですが、Perlもわからずちんぷんかんぷんです。 とりあえずそれらしきもの(^[\x00-\xff]+$)を見つけたのですが、 これをそのままPHPでやってみたところ、日本語が混じってるのにも関わらず、 マッチしてしまったようです。 PHPではどうかけばいいのでしょうか?どなたかアドバイスお願いします。
437 :
デフォルトの名無しさん :2007/02/09(金) 15:01:40
439 :
デフォルトの名無しさん :2007/02/10(土) 22:02:19
A,B,CDE,F #A,B,C,D HOGE,HOGE, aiueo,kakikukeko #E,F,G .... というようなデータがあったとして、 #で始まる行だけ「,」を「&」に置換するのは正規表現だけでできるでしょうか? PHPのpreg_replaceを使った置換ライブラリが既にあって、 それを通す時に置換しないといけない状況なので困っています…。 ↓こういう出力になって欲しいのです。 A,B,CDE,F #A&B&C&D HOGE,HOGE, aiueo,kakikukeko #E&F&G ....
440 :
乞食 :2007/02/10(土) 23:09:20
めぐんで下さい。 ClipsedをTeraPadに追加したのですが、ClipsedのGUIの日本語が 文字化けして読めません。Clipsedのメイン画面と複数検索補助画面の 画像ファイルをどこかにアップして頂けないでしょうか? よろしくお願いします。(ペコ
>>439 行頭が#のときだけ置換してから呼ぶというパターンでなんか不具合があるの?
if (preg_match(行頭の#)) {
plage_replace ほげほげ ← ,を&に置き換え
}
ライブラリ呼び出し
つーぱたーんでさ。
443 :
デフォルトの名無しさん :2007/02/11(日) 06:24:53
>>442 ありがとうございます。PHPのコードが入れられたら一発なんですよね。
でも、設定ファイルに相当するものしか変更する権限がないので、
プログラム部分が一切変更できません。なので、正規表現のみで実現できないか悩んでいます。
しかも変更できる部分が
preg_replace('/スラッシュの内側と/', '置換後', ...);
だけなので、パターンに/eとか/mを指定してすることもできず、例えば
preg_replace('/^L.*$/me', "str_replace(' ', '', '$1')" ...);
となるようにすることもできません。
ウワーン(T_T)
444 :
デフォルトの名無しさん :2007/02/11(日) 20:11:19
preg_replace('/^\#.*$/me', "str_replace(',', '&', '\\0')", $data); うちはこれで動作したみたいだけど
446 :
デフォルトの名無しさん :2007/02/11(日) 20:44:01
ありがとうございます。
>>443 の通り、プログラムが書けるわけではないので
正規表現のみでできないか探しています。
447 :
442 :2007/02/11(日) 23:59:26
>>443 そーゆー制限事項は省略せんでくれ
正規表現にこだわって問題を難しくしている人がままいるので気になるのだよw
でだ、
<?php
$str0 = "#a,b,c,d";
$str1 = "e,f,g,h";
$pat = "/(?=(?:#|(?<=.)\G))([^,]*),/";
echo preg_replace($pat, "$1&", $str0), "\n";
echo preg_replace($pat, "$1&", $str1), "\n";
結果
#a&b&c&d
e,f,g,h
こんな感じになったがこれでよいかや?
行単位じゃないならこれで動くかな?
ほとんど
>>447 のパクりだけど
$str = 'A,B,CDE,F
#A,B,C,D
HOGE,HOGE,
aiueo,kakikukeko
#E,F,G';
echo preg_replace("/(?=(?:#|(?<=.)\G))([^,\r\n]*),/", "$1&", $str);
449 :
デフォルトの名無しさん :2007/02/12(月) 17:49:40
>>447 失礼しました。
既存のライブラリを使わないといけない制限はかなりツライですね…。
>>448 の方法で動きました!
内部的に行単位じゃありませんでした。
感謝の気持でいっぱいです。
ありがとうございます。
うをースゲー!
450 :
デフォルトの名無しさん :2007/02/12(月) 19:51:34
PHPの正規表現で携帯から送信されたメールのヘッダから宛先アドレス部分を取り出す場合の質問です。 preg_match("/To: <(.+?)>\s/", $header, $result); ・・・と書いています。これでvodafoneのV602SHから送信されたメールでは上手くいきました。 これはこれでメールの仕様通りだと思いますが、 もしも「To」が「to」や「TO」だったら? もしも「To:」の後ろのスペースが1つじゃなかったら?? もしも「< >」が使われていなかったら??? etc. そう考えていくと正規表現を何パターンも用意しなくてはならず、漏れが怖いです。 こういうとき、皆さんはどう対処していますか? この場合の汎用的な正規表現ってあるのでしょうか? なお、検索したらモード修飾子というものがあるのを知り、 preg_match("/To:\s?<?(.+?)>?\s/i", $header, $result); にしてみたら、かえって悪くなりましたorz 今までマッチしてたはずのものにもマッチしなくなりました・・・
基礎くらいちゃんと勉強してきな
…と、回答できるほどの基礎能力が身に付いていない
>>451 の独り言であったww
* []
454 :
436 :2007/02/13(火) 04:37:32
>>438 返答おそくなってすみません。
\x7fにしたところみごとできました。
本当にどうもありがとうございます。
455 :
450 :2007/02/13(火) 11:22:48
おはようございます。 昨夜いろいろ試してみましたが、結局ダメでした・・・ どなたかお知恵をお貸しください・・・
>>455 答えようかと思ったらすでに回答ついてるじゃないか
>>456 分からないなら分からないと素直に認めないと。
簡単すぎて答える人がいないだけだと気づけ
>>458 「自分は玄人ぶってるけど、実は自信が無いただのバカです」と気づけ。
この板過去にさかのぼってIDが突然表示されたら面白そう。
>>450 「メールヘッダからメールアドレスを抜き出したい」
という要件を「厳密に」やろうとすると、実は極めて難しいです。
<p>aaaaa</p> …いくつかの改行 …いくつかの文字列 <div>bbbbb</div> この様に複数行にわたる文字列<p>〜</div>の一致を返すことのできる正規表現はありますでしょうか、 またそれは可能でしょうか、どうぞよろしくお願いします。
あります、そして可能です。 こちらこそよろしくお願いします。
ありがとうございます。
>>463 では、その方法を伝授してはいただけないでしょうか。
>>461 「メールアドレス」を厳密にやるのは難しいけど、
とりあえずメアドのマッチは適当でいいとして、
ヘッダの中から「To:」で始まるメアド「らしき」文字列を抜き出すのは
簡単なのでは??
必死w
>>469 いま話題になってるのは、「メアドそのもの」のマッチじゃなくて、
メールのヘッダから「To:の行」を取り出す話。
javascriptで 1999-12-23日のような形式をした日付けかをチェックするために function checkDate(str){ if(! str.match(/^(\d{4})\-(\d{2})\-(\d{2})$/)) return false; var sYear = parseInt(RegExp.$1); var sMonth = parseInt(RegExp.$2); var sDay = parseInt(RegExp.$3); if(sYear<1950) return false; if(sYear>2050) return false; if(sMonth<1) return false; if(sMonth>12) return false; if(sDay<1) return false; if(sDay>31) return false; return true;} function checkSubmit(obj){ var empty_flag_title = obj.title.value == ""; var empty_flag_from = obj.date_from.value == ""; var empty_flag_to = obj.date_to.value == ""; if(empty_flag_title && empty_flag_from && empty_flag_to){return false;} if(!empty_flag_from){ var str = obj.date_from.value; if(!checkDate(str)){return false;}} if(!empty_flag_to){ var str = obj.date_to.value; if(!checkDate(str)){return false;}} return true;} とこんな感じでチェックしているのですが 2007-01-01は通るのに2007-01-08もしくは09は通りません. 自分にはまったく通らない原因がわかりませんでしたので,どなたか何処が間違っているか教えてください. よろしくお願いします.
parseInt("08") == 0 parseInt("08", 8) == 0 parseInt("08", 10) == 8
473 :
471 :2007/02/16(金) 12:49:48
>>472 返信ありがとうございます.
無事解決できました.
474 :
デフォルトの名無しさん :2007/02/16(金) 22:33:22
アクセスログの解析で、****.gifは削除してカウントしたいのですが、 正規表現でどのように現すか分かりません。。 .*(?!gif) でわ、****.gifもマッチしてしまいました。。 どのようにすればよいかお教えくださいです!
>>474 ****.gifにマッチしたら除外する方がよくないか?
とりあえず正規表現ドシロウトなので天麩羅のページ行って こんなの作ったけどうまくうごかねぇ・・・ 動作目標は 先頭から+-が1つまたは無し 0から9の文字が1以上10以下連続し その後でピリオドがあってもなくてもよい ピリオドがない場合そっから後ろの文字が何にもなければOK ピリオドがあった場合0から9の文字が1つ以上3以下連続してある事 ^[-+]?[0-9]\{1,10\}[.][0-9]\{1,3\} これで動くかなと思ったけど今一歩・・ 実際どこが悪いかといわれるとピリオド判定が悪い気がするんだが・・・ もし気づいた人いたら指摘くださいませんか?
それだとdotが必須になってるね。 dotを含めた小数点以下があるかないかだから、 (\.[0-9]\*{1,3\})? かな。
479 :
デフォルトの名無しさん :2007/02/22(木) 12:07:51
>>478 トンクス!
あ〜グループにしてそれがあるか無いかの判断と考えればいいのか
やってみます!ありがとでした
正規表現おもすれー( ^ω^)
481 :
デフォルトの名無しさん :2007/02/26(月) 00:45:14
htmlファイルの編集をPHPでやりたいと思っています テーブルタグが2重(3重)になっているものがありまして <table> <table>なにかKeyになる文字</table> </table> の時に内側のテーブルのみを消去したく $html = preg_replace('/<table>.*?Key.*?<\/table>/is', '', $html); としてみたのですが、外側の開始タグ以降から消去してしまいます 正規表現自体知ったばかりなので初歩的な質問かも知れませんが ご教授いただけるとうれしいです
×ご教授 ○ご教示
>>481 そりゃ正規表現で処理すべき問題じゃない。
知ったばかりだというならなおのことその辺に注意すべき。
ネストを二重に限定していいなら手でネストを書いとけば?
あとPHPのpreg_だと再帰的な構造も書けた気がするけど
書き下すの面倒なので俺はパス。
>>481 Perlしか知らないけど
/<table(?!<table)(.(?!<table))*?<\/table>/
これで行けない?
ごめん /<table(.(?!<table))*?<\/table>/ だ
/is ね
質問です。 例えばカンマで分解したいのですが、括弧やクォーテーションで括られたカンマは 対象外にしたいのです。 例1)aaa,bbb,ccc aaa bbb ccc 例2)aaa(a1, a2),bbb(aaa(a1, a2)),ccc("9,999") aaa(a1, a2) bbb(aaa(a1, a2)) ccc("9,999") お助けください。
489 :
デフォルトの名無しさん :2007/02/27(火) 19:16:29
PHPで以下のようにしてvalueの中身を取得したいと思っているのですが、マッチしません。 $line=preg_match('/<input type="hidden" name="MT" value="(.*?)">/i',$line,$reg); やはり、間違ってますかね?
$reg[1]に入ってるはず
491 :
デフォルトの名無しさん :2007/02/27(火) 19:23:26
>>490 レスありがとうございます。入ってないんですよね。
具体的には
<input type="hidden" name="MAP" value="E139.44.55.110N35.39.19.420">
<input type="hidden" name="MT" value="東京都港区芝公園4-2-8">
という感じが、$lineに入っていくのですが。
preg_matchの戻り値を$lineに代入してるのは何?
493 :
489 :2007/02/27(火) 19:34:30
単純にマッチしたかどうかをチェックするためです。紛らわし書き方すみません。 print_r($reg); とやっても何も入っていないのです orz
すいません、教えてください、、VBAで、テキスト中から、 $$自由な文字 {{自由な文字}} 例)$$foo {{boo boo boo}} を抜き出して、自前でセレクタと要素を表現、みたいなことをやろうと色々やってみています。 現在は下のような感じなのですが、 myRegExp.Pattern = "\$\$([^{{]*)\{\{([^}}]*)\}\}" 例2)$$foo {{ boo boo } boo }} {{で開け、}}で閉じているつもりなのに、例2のように}を単発入れると 無視してしまいます。 どこが悪いのでしょう、、どなたか教えてください・・
[^{{] は [^{] と同じだぞ?
496 :
494 :2007/02/27(火) 22:23:31
>495 ありがとうございます。今試して知りました・・。 長々と相談をしてしまいましたが、質問を絞れました。ご指摘いただいたように 「{{」以外の任意の文字、を表現したい、というのが相談の肝です。 ([^{{2}]←これでいくように思えたのですが、駄目ですね・・。) ご教授いただければ幸いです。。
498 :
494 :2007/02/27(火) 22:44:35
>497 失礼しました。
一文字で表すと責任だそうですが/./にマッチしません。 自民党に訊いた方がいいですか?
500 :
デフォルトの名無しさん :2007/02/28(水) 14:36:35
<a href="/rap.php?q=hogehoge&p=2">hogehoge</a> このリンクタグからhogehogeを抜き出すには、どのように書けばいいのでしょうか? PHPなのですが、以下のように書いて取得できません。 preg_match("/(\bhref\s*=\s*[\"']?)(\/rap.php[^\s\"'>]*)">(.*)<\/a>/i",$line,$reg); 最後のキャプチャ部分が取得できないのですが。。。
その正規表現はどこかからか持ってきたものを改造したものなのか? それではマッチしないだろ…常識的に考えて…。 [^\s\"'>]* ←これは感心した。 /\bhref\s*=\s*([\"']?)\/rap.php?([^\s\"'\/>]*.*?)\1\s*>(.*?)<\/a>/ こんな感じでどうだ?
ミスった。 rap.php? → rap\.php
504 :
デフォルトの名無しさん :2007/03/02(金) 00:13:42
>>504 正しい
(?!foo)は現在の注目地点から見て、その後にfooが続いていない、という条件
(?!foo).で、それ自身がfooという文字列の1文字目にならない1文字にマッチ。
(?:(?!foo).)*でその繰り返し。
(?:(?<!foo).)*
だとある1文字の前にfooという文字列が来ない、という繰り返し。
最後にfooがあったらマッチしてしまう。
(?:.(?<!foo))*
これなら得られる結果は違うが条件を満たす。
C#で正規表現を使用しています。 C++ファイル(.cpp)のメソッドの実装部分だけをくり抜こうとしています。 void Test::Test(void) { // メソッド実装 } 上記の { から } までを抽出しようとしているのですが "^\{.*?^\}"ではマッチしません。 どうすれば { から } を抽出できるでしょうか?
こりゃまたあんたえらい無茶言いよんな。
自己解決しました。 "^\{[\n\s\w\\\*\+\.\?\{\}\(\)\[\]\^\$\-\|\&\""=:;\/,!#\<\>\+%']*?^\}" でヒットしました。 もっと短くなればいいのですが。 あと、半角カタカナのコメントがあるとだめですが。
必ず行頭に { とか } があるって条件なら Regex r=new Regex(@"(?<=\n)\{(.*?)(?<=\n)\}",RegexOptions.Singleline); でいいんじゃないですか?
510 :
デフォルトの名無しさん :2007/03/03(土) 00:59:09
perl質問板で質問したらこっちの方が適切だと教えられたので誘導されてきました。 「$textにいくつかの文字列候補、例えばApp,Bbq,Ntk,Sunが2個以上(非重複)含まれる時」 っていう条件はどう書けばいいのでしょうか? 1つだと $text =~ /(App|Bbq|Ntk|Sun)/だけど・・・
Perl なら /(App|Bbq|Ntk|Sun).*\1/ でいけた気がする。
それって重複じゃね。
>>508 とりあえず、その過剰で余計なエスケープをやめれば短くなるでそw
>>511 なんか条件の文があいまいだな。
そのあげられた単語の中から二種類以上見つかったら当たりってこと?
Perlスレの811にあるようにリストコンテキストで受けて、その中身を
チェックした方がいいと思うよ。正規表現だけでやってやれなくはないと思うけど
多分効率が悪い。対象の単語の数が増えるならなおさら。
515 :
デフォルトの名無しさん :2007/03/03(土) 06:15:55
>>514 > そのあげられた単語の中から二種類以上見つかったら当たりってこと?
そうです。例えばマッチする$textの例としてはMonSunFayAppなどです。マッチングしない例としてはAppMonAppKeyなど。
>リストコンテキストで受けて
う・・とりあえずレス811を見たんですが
(scalar @{[$text =~ /App|Bbq|Ntk|Sun/g]} >= 2)
これでいけるんでしょうか??
もう試していると思うけど、それでは無理。 正規表現にこだわらないなら(スレ違いだけど): (grep { $text =~/$_/ } qw(AA BB CC)) >= 2
perlスレに引っ込んでろよ。
いいえ。
間違い
ではありません
判断下す前に辞書くらい引いたらどうなんだ。
>>510 お前さん移動するなら元のスレに一言くらい書いといてくれよ。
"abc<def>ghi<jkl>mno" こういう文字列があった場合、 "<"から">"までを検索したいんですが、 一回目は<def> 二回目は<jkl> に、ヒットさせたいと思ってます。 "<.*>"で、検索すると、 "<def>ghi<jkl>"という具合にマッチしてしまうんですが、 何かいい方法はないでしょうか?
"<[^>]*>"とか。
526 :
524 :2007/03/04(日) 17:09:31
>>525 いけましたっ!
ありがとうございます。
IgnoreCase の場合で、一致したパターンそのものを得たいのですがどうすればよいのでしょうか。 例えば、hogeboo を (HoGe|Fuga) ってパターンで一致させる場合、$1 は hoge になります。 得たいのは HoGe です。
528 :
504 :2007/03/06(火) 06:17:12
>>505 せっかくすぐにレスをいただいたのにお礼が遅くなりまして、すみません。
なるほど。「現在の注目地点」という考え方をするのですね。
なんとなく、前とか後とかとしかとらえられていなかったので、勉強になりました。
よくわかりました。どうもありがとうございました。
>>527 一度HoGeに置き換えてもう一度マッチさせるとか
>>527 ワイルドカードや量指定子などがついていないなら
正規表現の文字列表現をマッチさせて取り出した部分文字列で逆に検索すればいいんじゃね?
(?i:HoGe|Fuga) -> hogeboo -> hoge
?i:hoge -> (HoGe|Fuga) -> HoGe
この機能が正規表現の処理系に組み込みであればデバッグとかに凄く便利そうだけど、 一般には理論的に不可能なのかな?
可能だけどニーズが無いだけ
実質的に|でどっちに分岐したのかを判定するのにしか使えなくね?
まさしく switch 文などでの分岐で利用したいのです。
コードの可読性を考えて、IgnoreCase の case でひっかけたい。
現在は小文字化や大文字化した後の文字列でひっかけてます。
その場合、case 条件の値が小文字化や大文字化済の文字列になって、
いまいち見た目美しくない。
たいした問題ではないのですが、気分的にいやなので。
case の一致条件が IgnoreCaes にできる処理系だといいんですが。
>>530 Hoge や Fuga など取り出す部分を対象文字列分用意して置き換えてしまえば
可能なのはわかりますが。
$1 風にエレガントにできないのかな〜と?
できるかできないか、できたとしてどのように実現するかは処理系に依存するわけだが、 その処理系を明らかにしてくれないことには答えようがないと思うんだ。 ここまでのお前さんのレスだけだと、処理系を作ろうとしているのか、 既存の処理系を使っているのかすらわからない。
もうさあ、処理系に何を使ってるか示さない香具師に回答するのやめようや。
質問です。 www.hoge.jp/huga/index.html のような文字列を www.hoge.jp と /huga/index.html とに分割したいんですが (要は1個めの"/"の前と"/"以後で分けたい)、この場合それぞれにマッチする 正規表現はどうなるでしょうか?
前者: [^/]* 後者: .*
($domain, $filename) = $url =~ m|(.+?)/(.+)|; perl的。
($domain, $filename) = split '/', $url, 1
いちばん萌える正規表現って何ですか?
どうせ [ぁ-ん]とか期待してるんだろ!!そうだろ!!
>>541 メールのヘッダのアドレスを解析するやつ
547 :
546 :2007/03/17(土) 01:59:09
とりあえず re.sub(pattern, repl, string) の repl に関数を指定する方法で解決しました。 一行でできればなおベストですが・・・ お邪魔しました。
548 :
デフォルトの名無しさん :2007/03/18(日) 03:28:43
Javascriptの正規表現って、perl互換だっけ?
>>548 互換てどこまでの意味でいってる?
たいがいの表記なら使える程度なら互換性はある。
Perlしかないものがあるのと、
バグまで含めた動作でいえば互換性は
ないかもしれない。
>>548 のレベルで使いこなせる範囲では互換性はある。
事実だけど、そういう意地悪なこと言う奴は死ねばいいのに。
まあそのうち死ぬから
その程度でいちいち腹を立ててたら早死にするよ
555 :
デフォルトの名無しさん :2007/03/27(火) 11:20:01
htmlから<input>のname要素のみを取得したいのですがどのような正規表現になりますか? <input type="text" name="test1" value="aaaa" size="20"> →<input type="text" name="" value="aaaa" size="20"> <input>を見つける事ならできるのですがname="test1"部分のみを取得する方法がわかりません。 お力を貸してください。
556 :
555 :2007/03/27(火) 12:50:24
自己レスになりますが <[^\/A-Za-z]*input[^>]*(text|checkbox|radio|hidden)[^>]*(name[ ]*=[ ]*[\"\'][0-9A-Za-z][^\"\']*[\"\'])[^>]*> でサブパターンにマッチした文字列を置き換えるようにしました。 間違えてたらご指摘いただければと思います。
557 :
デフォルトの名無しさん :2007/03/27(火) 19:32:45
7:25PM up 167 days, 2:03, 2 users, load averages: 1.74, 1.67, 1.30 シェルのuptimeコマンドの結果から: 7:25PM up (167) days, 2:03, 2 users, load averages: (1.74), (1.67), (1.30) 丸括弧( )で括った部分をマッチさせるために、次のように表現してみました。 / up (.+) days?, .+ load average: (.+), (.+), (.+)/ もっとスマートな表現方法があればアドバイスをお願いします。
/proc/uptime と /proc/loadavg 見る方が良さそうだけど・・・ってLinuxじゃないとだめか。 とりあえず非欲張りな量指定子が使えるならそれ使った方がいいし、 . にしないで [0-9.] とかにしたほうがよさそう。
[0-9.]みたいにしたら欲張りな方が速いか。 後、uptimeって1day未満の場合の書式はどうなってんのか知らんがだいじょうぶなの?
uptimeの見本。 RedHat: 19:54:00 up 2:59, 4 users, load average: 1.00, 1.02, 1.02 FedoraCore: 19:55:03 up 50 days, 13:17, 3 users, load average: 0.00, 0.00, 0.00 Solaris: 7:58pm up 1 day(s), 1:01, 2 users, load average: 0.03, 0.01, 0.02 午後 8時01分 稼働 1 日間, 1:04, 3 ユーザー, 平均負荷率: 0.00, 0.00, 0.01
561 :
557 :2007/03/28(水) 00:16:02
いろいろ悩んだ結果、Load Average の部分をマッチさせることにしました: /load average: ([0-9.]+), ([0-9.]+), ([0-9.]+)/ みなさん、ありがとうございました。
教えて君です。急にperlのメンテをする羽目になったのですが、perlも正規表現が読めなくて困っています。 sjisにて、 $tmp =~ s/?:\x0D\x0A|[\x0D\x0A])?$/,/; というのは、 $tmpの(「CRの次にLFが続くもの」もしくは「CRまたはLF」)が0もしくは1個続いた後で行末に続くという箇所をカンマで置き換えるという解釈でよろしいでしょうか?
>>562 左括弧が抜けているが、多分その通りだね。
元のソース作った香具師は、かなりの糞だな。
普通は次のように書く。
$tmp .= "," if chomp $tmp;
「かなりの糞」などと言われなくてはいけないほどのコードでもないと思うのだが。
それに意味変わってるしな
ちょっとお聞きしたいことがあります。 複数の文字列に一致させたい場合、たとえば「ヨーグルト」「プルーン」を含むテキストに一致させたい場合は、 次のようにすればいいのでしょうか。 .*ヨーグルト.*プルーン で検索。次に .*プルーン.*ヨーグルト 自分で言うのも情けないですが、ずぶの素人なので相当あほなやり方でやってる気がします。
|
>>568 orではなく、両方を含む文字列に一致させたいのですが。
ヨーグルト.*プルーン|プルーン.*ヨーグルト
grepで「hogeで始まる行以外」を抽出したいんですがどうすればよいんでしょうか? 一文字なら grep "^[^h]" target > destination みたいな感じですが。
grep -v
573 :
571 :2007/04/10(火) 22:42:39
URLのようなそれほど長くない文字列のリストを一気に検索したいのですが、 マッチしたかどうかだけが知りたくてマッチした文字列そのものはどうでも良い場合、 最短マッチと最長マッチではどちらの方が高速に動作するのでしょうか? ご存じの方が居られましたらご教示頂けますと幸いです。よろしくお願いします。
コストではもちろん最短だけどプログラムの作りによるから。
ということは、単純にひとつの文字列を検索する場合は最短マッチの方が速いが プログラムの設計によっては最終的な処理を終えた時点で逆転している可能性もあるという事ですね。 参考になりました。どうもありがとうございました。
何を参考にしてんだか... こういう奴が、単純にひとつの文字列を最短マッチで検索するのに すげー遅いプログラムとか書いたりするんだろうな。
>>577 自分がそういうプログラムを書かないという保証はありませんが、
今回の話に限れば他人が書いたプログラムで使われている正規表現の
最短/最長マッチの使い方が妥当だったのかどうかを知りたかっただけですので
ご心配なく。
パール最強伝説ってのがあると聞きました 本当ですか
>>578 まあ、「心配するな」って言ってるんだからいいか...。
お前の方が心配だよ俺は。
582 :
デフォルトの名無しさん :2007/04/21(土) 03:00:42
vimで ^abc\~\?\w\+$ という正規表現について考えているのですが理解できません。 \~は「最後に置換された文字列」と解説されてたのですがこの場合置換自体していません。
>>582 magic オプションの設定によって意味が違うみたいだけどその辺は?
それでも \? がわからんな。
安易なパスワードを禁止したくて、正規表現を色々と試行錯誤しているのですが、うまくいきません。 同じ文字が3文字以上続くようなパスワードを禁止したいのですが、このような正規表現は可能でしょうか?
>>584 regexエンジンによってはできない。
正規表現に名前をつけて、あとから使い回せる構文があるならできる。
>>585 そんなに難しいケースなんですか。
ちなみにPerlを使っています。Perlって正規表現に強いと聞いていましたけど・・・。
>>586 本来の意味の「正規表現」からは思いっきり逸脱しているのよ > perl
んで、perlならこんな感じで検出できる。
while (<DATA>) {
print if /(.)\1{2}/;
}
__END__
fooxxxbar
xyxxydd
foobarbaz
> 本来の意味の「正規表現」からは思いっきり逸脱しているのよ なんだまた前日知ったばかりの知識で薀蓄かよ 頭悪そう
589 :
デフォルトの名無しさん :2007/04/22(日) 08:42:59
> 本来の意味の「正規表現」からは思いっきり逸脱しているのよ なんだまた前日知ったばかりの知識で薀蓄かよ 頭悪そう
本来の意味の「正規表現」って何?
ドラゴンブックとか中田育男の本で正規表現の定義してる。 φ={1、3、5、7、9}とか例題出してるけど、 それって状態遷移図の上にある点の集まり。 パターン中のバックリファレンスは図面書けないから定義と違う。 なんつーんだろ、動作中に図面が完成するというもの。
形式言語理論での正則表現か。 今更そんなものを持ち出すのも阿呆らしいけどな
有限オートマトン記述構文
お前の自作自演はサッパリ意味不明だ ここはお前の日記帳じゃないゾ
だんごやさんだよ
団子ちゃんなら日記帳にしてもいいんですっ><
597 :
デフォルトの名無しさん :2007/04/23(月) 02:04:47
団子チューさんが来たからにはこのスレも安泰だYO
599 :
デフォルトの名無しさん :2007/04/23(月) 03:44:34
PHPで連続しないある1文字ならsplitというのをしたいのですが、うまくいきません。 abc@@aa@a@b123@@@@という文で@で区切りたい場合、 abc@@aa a b123@@@@ のように区切りたいのですが・・・ splist("@{1}",$str);では当然ながらだめでした。
600 :
599 :2007/04/23(月) 07:15:58
split("[^@]@[^@]",$str); だと abc@@a @b123@@@@ と周辺の文字も一緒に削ってしまうのでだめでした。 ああ、正規表現難しい・・・
$arr = array(); foreach(preg_split('/(@+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE) as $t) { if($t == '@') arr[] = ''; else arr[count(arr) - 1] += $t; }
肯定先読みと肯定後読みを使うんだ
603 :
599 :2007/04/23(月) 08:35:53
>>601 すいません、私の頭では理解できませんでした・・・コピペして使ってみたら
PHP Parse error: syntax error, unexpected '[' in [URL] ってでました
>>602 まさにやりたいことがそれみたいで、
$bufsplit = mb_split("(?<!@)@(?!@)", $buffer); と早速試してみたところ
PHP Warning: mb_split() [function.mb-split]: mbregex compile err: undefined (?...) sequence in [URL]
とでてしまいました。
PHP4だと使えないんですかね・・・orz
>>603 $str = 'abc@@aa@a@b123@@@@';
var_dump(preg_split('/(?<!@)@(?!@)/', $str));
>>603 PHP4 の mb_regex は鬼車になっていない。
ので戻り読みは使えない。
与えられた有限オートマトンと等価な正規表現を求めるライブラリとか どっかにないすか? 逆は簡単なんだけどなw
------------------------- うんたらこうたら・・・ HOGE_START 00 1 2 3 4 5 11 6 7 8 9 10 22 11 12 13 14 15 HOGE_END うんたらこうたら・・・ ------------------------- 上のHOGE_STARTとHOGE_ENDの間の データの00と1,11と6,22と11の部分の値を取得したい場合、 どのように記述すればよいでしょうか? ちなみにこのHOGE_STARTとHOGE_ENDの間の行数は変動します。 補足です。 ウェブプログラマー初めて2年近くたつんですが、 正規表現が糞レベルから一向に上達しません。 なんとか苦労して使えば誤動作の嵐です。orz 習うより慣れろなんでしょうか?
609 :
608 :2007/05/02(水) 00:25:01
素朴な疑問なのですが、 特定のデータファイルから 規則性のある部分の一部データを抜き出したい場合、 正規表現を使うものなんでしょうか? まさに608のようなケースなんですが、 このパターンの正規表現の苦手っぷりがひどいです。
>>608 PCREな。
/(?<=HOGE_START\x0A|HOGE_START\x0D|HOGE_START\x0D\x0A)(.*?)(?=HOGE_END(?:\x0A|\x0D|\x0D\x0A))/s
にマッチする全体
PerlとかPHP使うならもっと単純な正規表現で十分だが。
>>608 正規表現、つかawkあたりの出番じゃね?
awk '/HOGE_START/,HOGE_END/ {
最初と最後の行が入っちゃうけどお好みでデータを処理
}'
CGIとかでという話なら、Perlもおんなじことできるよ。
>>609 まず行に分解して
固定長ならunpack関数、可変長ならセパレータの正規表現作って配列に分解して
何番目か数えればいいんじゃない?
JavaScriptで AAAA|BBBB|CCCC という文字列を分解して AAAA BBBB CCCC という配列を正規表現で返したいのですが上手くいきません、 使った正規表現「(.*)[|]?(.*)[|]?(.*)」 いい方法ありませんか?
split()じゃいかんの?正規表現を使わないですむし
最短マッチデフォだと全く捕獲しなくていいな
「(.*)[|](.*)[|](.*)」で
AAAA|BBBB|CCCC
の場合
AAAA
BBBB
CCCC
を取得できたのですが
AAAA|BBBBになった場合
nullになってしまいます。・゚・(ノ∀`)・゚・。
「(.*)[|]?(.*)[|]?(.*)」
でも同じです。
>>614 正規表現を使用してやりたかったので・・・
要素がnullの時に空にするだけじゃないか。
> (.*)[|]?(.*)[|]?(.*) 最短マッチだと文字列に全くマッチしないって理屈わかる?
(.+)(\|(.+)(\|(.+)・・・・)))) で奇数番目を取る。 でも素直にsplit使えよ
/[^|]+/g でも素直にsplit使えよ
先読みを使って、Matches に入った AAAA、BBBB、CCCC を処理する .*(?=\||$) でも素直にsplit使えよ
ありがとうございます。勉強になりました。 素直にsplit使うことにします。
623 :
デフォルトの名無しさん :2007/05/07(月) 01:24:53
foo@localhost, "foo,bar,baz" <foobarbaz@lodalhost>, foobar@localhost PHPなんですが、このようなリストがある場合にカンマ区切りで 値を取得するにはどうやれば良いのでしょうか。 但しダブルクォートの中の文字は分割したくないです。
>>623 csvのデータだとみなして分割してやればいいんじゃね?
csvのハンドリングのサンプルは転がってるでしょ。
>>623 それはリストが悪い。セパレータをタブとかにすべきだな
626 :
デフォルトの名無しさん :2007/05/07(月) 20:37:18
Rubyっていいの?
?
629 :
デフォルトの名無しさん :2007/05/08(火) 00:50:16
>>628 あー、もうコイツ最悪だな!!!!
質問者として、態度悪すぎ
今後、
>>623 には一切レスなし
自演乙
「;」以前の空白、そして「;」以降の文字を指定したいんだけど *;.* とすると改行まで入ってしまう。どうすれば。
入るじゃなくて「消える」の間違いでした。
あんたの使ってる処理系では . が改行にマッチしないんでしょ 挙動を変更するオプションがあるかもしれんからマニュアル嫁
正規表現で 「数列のみ もしくは 数字-数字-数字」 と言うのはどう書くですか?
\d-\d-\d|\d+
できました
文章中の 小日向(こびなた と読む) とかの文字列で括弧内と括弧を指定したいんですけど 誰か教えてください。
日本語未対応perlにてsjisで ^[ぁ-ん]+$ ^[ァ-ヶ]+$ はどう書きますか?
>>638 5.8以上でutf8で扱う
それ以外に方法はない
^(?:\x82[\x9f-\xf1])+$ ^(?:\x83[\x40-\x96])+$
アクセスを解析するにあたってホストアドレスをある程度まとめたいのですが (例えば test1.test.ne.jp→*.test.ne.jp) その場合どのように表記すると良いでしょうか?
全角文字ならヒットは出来ますか?
644 :
デフォルトの名無しさん :2007/05/13(日) 12:07:25
指定の文字列がないというのにマッチしたいのですが、いい正規表現はないでしょうか? "HOGE MAGE" "ARABIN DOBIN MAGE" というのがあった場合、"DOBIN"が含まれていないつまり、"HOGE MAGE"のみをヒットさせたいです。
mage を拾って dobin があるか 調査する
>>644 その程度の処理なら態々正規表現を使うまでも無い
マッチする文字列を探すのとしないのを探すのって本質的な違いってある?
のっと
649 :
デフォルトの名無しさん :2007/05/13(日) 16:38:44
650 :
デフォルトの名無しさん :2007/05/13(日) 16:41:21
651 :
644=649=650 :2007/05/13(日) 16:42:04
x こちらに、含まない正規表現をジェネレータがありました。 o こちらに、ある文字列を含まない正規表現を生成するジェネレータがありました。
js弄りたい。 ↓ 正規表現なるモノが解らないと少しの改変すら困難なようだ。 ↓ そうだ2chでスレを探そう ↓ 発見ナニこのスレ暗号!? ↓ 1のサイトを見よう! ↓ 脳沸騰中 ←今ココ○| ̄|_
日記はチラシの裏へ
ここがチラシの裏だろ
何その2週間もかけたツッコミw のんびりした板だねここは
そうでもないよ
657 :
デフォルトの名無しさん :2007/05/30(水) 11:40:44
正規表現で数値チェックしています。 0〜15までの数値がOKという処理をしたいのですがうまくできませんでした。 [0-9]+[0-9]* など考えたのですが 二桁の数値の場合、例えば19、一桁目の1にマッチしてしまうようで 本来NGにしたいのですがOKになってしまいます。 0〜15までの数値はOK。他はNG。というような正規表現はどうやって書けるのでしょうか?
訂正、3行目 [0-9]+[0-5]* です。
(1[0-5]|[0-9])
正規表現の練習・確認用に ( 1[0-5] | [0-9] ) とか書くとエディットボックスに (1[0-5]|[0-9]) と連結されて さらにターゲットとなるテキストでマッチした行を抜き出す。 といったアプリというかGUIツールってないですかね。 それくらい自分で作ればいいんですけど・・・
たしかどっかのサイトにあった URL 思い出せないけど検索したら出るだろ
どうしてエディタの置換にスクリプトが使えないのは何故なんだぜ?
それは安物だから
プログラミングにメモ帳使うのはもうやめような。
メモ帳って 「右端で折り返す」チェックしてて 実際行が長くて折り返されてるファイルを うっかり上書きで保存してしまうと 勝手に改行挿入されて行が分かれるよねw 前はそんなことなかったのになぁ いつからだろ
メモ帳ができてから。少なくともWin3.1のときには既にそうだったと記憶している。
readme.txtビューアに多くを期待しすぎだ
669 :
657 :2007/05/31(木) 12:36:29
再度質問なのですが、教えていただいた正規表現でチェックを掛けているのですが どうも抜けてしまいます。 どこがおかしいのでしょうか。。phpで書いています。 if(!ereg("(1[0-5]|[0-9])",$chk){ //エラー処理 }
^(1[0-5]|[0-9])$ とか
(^|\D)(1[0-5]|[0-9])(\D|$) とかか。こういうのはあまり正規表現でがんばらずに(\d+)で拾って範囲判定したほうが手っ取り早いと思うが。
672 :
657 :2007/05/31(木) 16:11:41
>>670 ,671
お二方どちらでもできました。
チェック関連を正規表現で統一したかったので頑張ってました^^;
ありがとうございました。
>>671 俺もそう思う。
(1[0-5]|[0-9]) を見て、ぱっと 0 〜 15 を思い浮かべられる奴はそうそういない。
趣味でやってるなら余計なおせっかいだけどね。
(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15) が可読性を考えるとベストだなw
てか逆の方が読みやすい ([0-9]|1[0-5])
そんなことはない
679 :
デフォルトの名無しさん :2007/06/01(金) 00:59:29
K2Editorで改行のみの行が複数続いた場合、 1行のみ残したいのですが、どうしたらよいでしょう? "^\n"→""と置換すると1行目と5行目がくっついてしまいます。。 (1行目)│正規 (2行目)│ (3行目)│ (4行目)│ (5行目)│表現 ↓ (1行目)│正規 (2行目)│ (3行目)│表現
\n{3,} -> \n\n とか? つこうたことないから知らんけど。
"^\n+" ⇒ "\n" だめ?
つうかエヂタスレで聞け
[\w\.\/\?\-]+を[\w\.\/\?-]と書く奴死ね ハイフンはエスケープしなくても通用するが ゴチャゴチャするからエスケープ文字が連続してるところでは 1文字ずつエスケープするのが常識なんだよ
[\w./?-]
一番最後にハイフンがあれば\-か単独の-に決まってるだろ。 そのくらいでゴチャゴチャとか言うなよ能無し
[\w\.\/\?-] ↓機能追加するとき [\w\.\/\?-0-9] ってやってしまうとどうなるの?
もう[-\w\.\/\?]でいいよ。
[\^ w ^\]vでいいよ
>>686 そんな無能がいる会社なら珍妙な書き方をするのも止むを得んな。
だいたい、正規表現を許可してるコーディング指針を決定した会社の質を疑うね。 まともな会社は正規表現禁止ってのも多い。 趣味でウェブプログラミングするくらいなら好きにすればいいけど。
劣悪な環境下での重労働ご苦労様です。
べんきよになります
color(red blue)やcolor(red blue black)やcolor(red bule black green) となったときに ()の中の色を別々にとりだせますでしょうか??
任意個数と言うのは無理だが上限決めてがんばればできなくもない。 でもそんな無駄な努力をしてる暇があったら、カッコの中をまとめて 取り出してからsplitした方が楽。
正規表現使用禁止なんていわれたらその会社辞めるな・・・
>>694 任意個数は無理ですよね。アドバイスありがとうです。
splitを勉強してまいります。
>>683 出遅れたが、俺は683にあるような無用なエスケープをつけまくるほうが嫌いだ。
-に関しては譲歩の余地はあるけどね。
bregexp.dllで char *target = ""; if(BMatch("/\\w+/", target + str(target), breg, msg)) printf("err:%s\n", msg); とやると err:invalid target parameter となってしまうんですが、tagetが空文字列のときはマッチさせない(というかエラーを出さない)ようにはできないですか?
strlen(target)
1行のif構文でも{}きちんとつけない奴死ね
ぱいそんとかるびーがたいへんなことに!
702 :
デフォルトの名無しさん :2007/06/06(水) 17:44:53
パーサ書けるようになるにはどんな本を読んだらいいでつか?
ドラゴンブック
をを!やっぱりコンパイラ関連の本ですか。じつは「コンパイラの理論と実現」という本を 昨日注文しちゃったんですが、この本でも桶?
翻訳した文章を読むのが辛い人は中田育男 数列を解読するのが辛い人はドラゴンブック
>>705 どうもです。キャンセルできたんで、もう少し検討してみます。
AHO
708 :
デフォルトの名無しさん :2007/06/07(木) 16:30:09
>>707 一瞬ばかにされたかと思ったら、コンパイラの本のことか・・・
AHO本ゆうべ注文しましたよ^^
Rubyで2ちゃんねる専用ブラウザ(ギコナビ)のログを1行ずつ読んで、
名前、メール欄、日付、曜日、時刻、ID、その他(BEなど)、本文、スレタイ
以上を後方参照で使えるようにするにはどのように表現したら良いでしょうか?
以下にとあるスレのログサンプルを置いておきます。
名無しさん<>sage<>2007/06/07(木) 21:57:04 ID:???<> <a href="../test/read.cgi/kitchen/1181221024/1" target="_blank">
>>1 </a> <>専用ブラウザのログのテスト
a<><>2007/06/07(木) 21:57:52 ID:7FjnB1uN<>
http://2ch.net/ <>
名無しさん<>sage<>2007/06/07(木) 21:58:35 ID:??? BE:10425941-2BP(2059)<> 改行 <br> と <br> BEのテスト <>
</b>◆h67iCpDPo. <b><>sage<>2007/06/07(木) 21:59:30 ID:???<> トリップテスト <>
念のため補足です。 名前<>メール欄<>日付(曜) 時刻 ID その他<> 本文<>スレタイ で表され、メール欄、ID、その他、スレタイは投稿内容や板の設定によっては空欄の可能性があります。
Rubyはしらねえけど、普通に<>でsplitすりゃいいんでないの?
Ruby初心者スレ池
714 :
719 :2007/06/07(木) 22:35:51
>>712 なるほど…'<>'で5つに分けて、
その後真ん中を' 'でもう一度splitすれば行けそうですね。
IDが無かった場合などの例外処理などが面倒そうですがちょっと試してみます。
715 :
710 :2007/06/07(木) 22:38:06
名前欄間違えてた…
>>713 環境の問題などがあるかもしれないので「Ruby」と書いたのですが、
可能ならば正規表現で取り出したかったので…
スレ違いなら申し訳ない。
\w+にマッチし、例外的にfooにはマッチしない というのはすんなり書けないものですかね。
grep -v fooしてから処理。
718 :
デフォルトの名無しさん :2007/06/09(土) 20:44:03
<table> <tr> <td>あああ</td> </tr> <tr> <td>いいい</td> </tr> </table> という$htmlがあって消したい部分は <tr> <td>bbb</td> </tr> の3行です いろいろ検索などして $html = preg_replace("/<tr>.+?[^<tr>].+?いいい.+?<\/td>/is", "", $html); とやってみたのですが最初の<tr>からずばっと消えてしまいます phpなのですが、ご教示いただけないでしょうか
>[^<tr>] アチャー
720 :
デフォルトの名無しさん :2007/06/09(土) 23:29:44
人 / 0.ヽ // ||ヽヽ (( / ヽ)) ヽヽ// ヽ/
721 :
デフォルトの名無しさん :2007/06/10(日) 03:21:26
あのさ、最初の例のどこに消したいという bbb を内容にもっているtd があるの? もうちょっとどういうテキストを扱いたいのか考えてみ。 そこに書いているのだけから考えると、改行をパターンに 入れときゃいいだけじゃないの? <tr>\n<td>.... みたいに。
どうもすみません <table> <tr><td>あああ</td></tr> <tr><td>***</td><td>いいい</td></tr> </table> 本当は改行やスペースなどが入っているのですが、 “いいい“から左方向に一番近い <tr> から、右方向に一番近い </tr> までの <tr><td>***</td><td>いいい</td></tr> の部分を消したいです よろしくお願いいたします
正規表現でやろうとするのが間違ってる
テンプレの
>>1 のPerl正規表現雑技にある
ある文字列とある文字列を含むものにマッチする正規表現
(?=.*foo)(?=.*bar)
(?=.*foo)(?=.*bar)(?=.*hoge)
てのはPerlでない場合には
(.*foo)?(.*bar)?
(.*foo)?(.*bar)?(.*hoge)?
こうなるんでしょうか?
それとも別の表現にしないといけないの?
>>723 PHPはよくわからないがPerlならこう書く
$html=~s{<tr><td>[^<]+</td><td>\Qいいい\E</td></tr>}{}
だが厳密にはこう書くかな
$html=~s{<table>(.*?)</table>}{
my $lines;
for ($1 =~ m{\s+<tr>.*?</tr>\s+}g) {
$lines .= $_ unless m/\Qいいい\E/;
}
"<table>$lines</table>";
}eg;
>>725 (foo.*bar|bar.*foo)
(foo.*(bar.*hoge|hoge.*bar)|bar.*(foo.*hoge|hoge.*foo)|hoge.*(foo.*bar|bar.*foo))
>>727 (?=.*a)(?=.*b)(?=.*c)(?=.*d)(?=.*e)はどうなりますか?
(a.*(b.*(c.*(d.*e|e.*d)|d.*(c.*e|e.*c)|e.*(c.*d|d.*c))|c.*(b.*(d.*e|e.*d)|d.*(b. *e|e.*b)|e.*(b.*d|d.*b))|d.*(b.*(c.*e|e.*c)|c.*(b.*e|e.*b)|e.*(b.*c|c.*b))|e.*(b .*(c.*d|d.*c)|c.*(b.*d|d.*b)|d.*(b.*c|c.*b)))|b.*(a.*(c.*(d.*e|e.*d)|d.*(c.*e|e. *c)|e.*(c.*d|d.*c))|c.*(a.*(d.*e|e.*d)|d.*(a.*e|e.*a)|e.*(a.*d|d.*a))|d.*(a.*(c. *e|e.*c)|c.*(a.*e|e.*a)|e.*(a.*c|c.*a))|e.*(a.*(c.*d|d.*c)|c.*(a.*d|d.*a)|d.*(a. *c|c.*a)))|c.*(a.*(b.*(d.*e|e.*d)|d.*(b.*e|e.*b)|e.*(b.*d|d.*b))|b.*(a.*(d.*e|e. *d)|d.*(a.*e|e.*a)|e.*(a.*d|d.*a))|d.*(a.*(b.*e|e.*b)|b.*(a.*e|e.*a)|e.*(a.*b|b. *a))|e.*(a.*(b.*d|d.*b)|b.*(a.*d|d.*a)|d.*(a.*b|b.*a)))|d.*(a.*(b.*(c.*e|e.*c)|c .*(b.*e|e.*b)|e.*(b.*c|c.*b))|b.*(a.*(c.*e|e.*c)|c.*(a.*e|e.*a)|e.*(a.*c|c.*a))| c.*(a.*(b.*e|e.*b)|b.*(a.*e|e.*a)|e.*(a.*b|b.*a))|e.*(a.*(b.*c|c.*b)|b.*(a.*c|c. *a)|c.*(a.*b|b.*a)))|e.*(a.*(b.*(c.*d|d.*c)|c.*(b.*d|d.*b)|d.*(b.*c|c.*b))|b.*(a .*(c.*d|d.*c)|c.*(a.*d|d.*a)|d.*(a.*c|c.*a))|c.*(a.*(b.*d|d.*b)|b.*(a.*d|d.*a)|d .*(a.*b|b.*a))|d.*(a.*(b.*c|c.*b)|b.*(a.*c|c.*a)|c.*(a.*b|b.*a))))
>>727 順番を考慮したパターンを書かないといけないんだね。
ありがとう。
>>723 (元レスは多分718ってことで)ってphpの正規表現では
出来ないのかな。
perlの例は726が書いてるけど、phpだったらstrposとかで
該当する部分を切り出しておいて投げる、みたいなことを
しなくちゃいけないのかなあ。
#うちもperl→phpにシフトする案件が結構増えてるんですさん。
>>723 正規表現だけでは出来そうで出来ない
プログラマ脳では出来そうなんだけどね
733 :
デフォルトの名無しさん :2007/06/11(月) 00:35:33
こんなこともできないのか〜〜〜〜〜〜、正規表現
適材適所
というかネストに制限の無いような対象は正規表現の最も苦手とする分野の一つだろう。
そもそも本来の正規表現はネスト扱えねえし。
どこで聞けばいいのかわからないのでここで質問させてください。 文字実体参照にマッチさせるにはどうしたらいいんでしょう? 「hoge」 にも 「ho&#8206;ge」 にも 「h&#lrm;o&#8207;g&#rlm;e」 にもマッチするような…
hoge|ho&#8206;ge|h&#lrm;o&#8207;g&#rlm;e
レスさんくすです。でもちょっと違ってて、 737はあくまで例で、どんな実体参照の一文字が入っててもOK、見たいなこと出来ませんか? h?o?g?eの正規表現版みたいな感じで…
普通は、実体参照を解決するフィルター通してから処理しない? 或いは逆に、全て実体参照にしてから処理するかw
/h(&.+;)?o(&.+;)?g(&.+;)?e/
>>741 さんくすぅ!思ったとおりの動作になりました
>>740 JaneでNGワードに指定しても、文字間に実体参照入れてNGを回避してくる輩がいるもんで…
/Se(&&'xEFcs):;SEXswd$3"#11!-~|^-Grvdxa?>0./-feFDCSexf%&(=-#%b,/
744 :
ぴかちゅう :2007/06/12(火) 13:49:07
文字列がルール部に記載されている2つ以上のパターンに一致する場合、lexではどのような規則で一致するパターンを一意に決めているかどうかってどういった意味かわからないんですが… 教えてください!
flexのマニュアルに書いてあるから読めよ
747 :
ぴかちゅう :2007/06/12(火) 14:02:39
学校の課題なんです…
748 :
ぴかちゅう :2007/06/12(火) 14:06:35
マニュアルってどこにあるんですか?
「私のことが私のことが」「試験場試験場」 みたいな3語以上の表現の繰り返しを探したいんですが、 正規表現チェッカーというソフトでは (.+)(.+)\1\2 で、抜き出されるんですが、Devasというソフトだとmax regex search depth exceededとエラーが出ます。神様、お導きを・・・
>(.+)(.+)\1\2 それだと2文字以上の繰り返しのような気が。 (...+)\1 だとどう?
752 :
750 :2007/06/17(日) 00:23:11
レスサンクスです。 > (...+)\1 これもだめですー。(><)
複数ファイルの置換ならDevasの代わりに speeeeed + bregonig.dll を使うとか。
>>750 どのくらいの大きさのファイル食わせた?
エラーメッセージからすると、バックトラック用に積んでいたスタックが
あふれたという感じだけど。
750のパターンでも、751でもマッチする文字列が見つからない場合にバックトラック用に
スタックに積んでくのは結構な寮になると思うぞ。
検索する語の最大長を指定するなりしてはどうか。
そのツールでできるかは知らんがね。
(.+)(.+)\1\2 ↑ これが乳房AAに見えて仕方ない。orz
いや、おれは 21エモンにでてくるゴンスケとかいうロボット。 ついでにいうと、NHK大阪の夕方の女子アナの顔な。
おお、確かにゴンスケにみえるw
斜め上のところに陥没があるおっぱい=乳癌
759 :
750 :2007/06/17(日) 14:00:34
レスサンクスです。
>>753 探して使ってみます。
>>754 一つのファイルは100〜500kくらいですが、フォルダ内のファイル全部では330Mほどになりますです。Devas以外ではKWIC Finderというのを使っていて、こちらは完全にプログラムが落ちます。
>検索する語の最大長
なるほど。ありがとうございます。
760 :
デフォルトの名無しさん :2007/06/18(月) 14:29:50
「★」のある文字列には一致するけど、 「@株主 ★」があると一致しない正規表現を教えてください。
761 :
デフォルトの名無しさん :2007/06/18(月) 17:17:04
(?<!@株主 )★
762 :
デフォルトの名無しさん :2007/06/18(月) 17:33:56
ぼくの肛門も性器です
ごめんなさい、JavaScriptで使うから戻り読み使えないんです。別の方法ありますか
>>763 書けるけどすごくめんどくさいよ。
「a」があるけど「xya」がない文字列ならこんな感じ。文字数ふえても
同じようなやりかたでいけるはず。
^([^a]*(([^x]|^)y|[^y]|^)a)+[^a]*$
「★」があるかどうかの判定と「@株主 ★」がない判定の2つに分ける
ことをオススメする。
>>764 できました!
^([^★]*(((([^@]|^)株|[^株]|^)主|[^主]|^) |[^ ]|^)★)+[^★]*$
ブラウザの設定を弄ってるのでそういった分岐は書けないんです。助かりました。
WindowsXPの標準テキストエディタである、NotePad上の文字列を 正規表現(自分で作ったルール)を使って文字列を変換すると、 パソコンで表現 が パャRンで阜サ のように変換されてしまいます。 これは、自分で作った変換ルールに誤りがあるからでしょうか? 変換には、クリップボード拡張ソフト「ペースター」のv3.08を使っています。 変換ルールは s/^\s+|\n+|\\|\/|\:|\,|\;|\?|\"|\<|\>|\|//gm です。 これは、Web上の文字列を、そのままコピペしてWindows上のフォルダ名にしたい時に、 (フォルダ名として)不適切な文字(\/:,;*?"<>|)や、他に、改行、空白を取り除く事を目的としています。 どのようにすれば改善されるか分かる方いませんか?
いつからメモ帳は正規表現をサポートするようになったんだ?
>>766 改善っていうか、それは正しく稼働した結果じゃねーの?
パソコンで表現
8370 835C 8352 8393 82C5 955C 8CBB
パャRンで阜サ
8370 83-- 8352 8393 82C5 95-- 8CBB
shiftjisのコードから、0x5Cが排除された結果みたいだし
シェアウェアの癖にマルチバイトに非対応ってこと?
テンプレサイトを見ればわかるが完全に近い漢字対応はむしろ少数派で 何かしら制約やら性能低下を伴うのが普通。 例外が鬼車とかboostとかなわけで。 GNU grepのdfa.c見てるけど歴史の呪縛感じるなぁ。
しょぼいシャーウェイにするぐらいなら秀丸にすればよいのに
言わしてもらうと正規表現エンジンのような 細かい設計と精密なデバッグを要求する職人芸は 商用ソフトでは採算が取れないだろう。 気の遠くなるような時間を浪費できるフリーソフトならではの世界w
文字列絡みはテストケース書きやすい方だと思うが
775 :
766 :2007/06/21(木) 01:06:31
みなさんレスありがとうございます。 アプリ側の限界という結論になるのでしょうか? 仕方ないですね。 2chブラウザJaneを使っているんですが、更新チェックしていたつもりが、 なぜかこのスレだけチェックされていませんでした。 返信がおそくなってすいませんでした。
>>775 んーと、そのソフトの仕様的に可能なのかはわかんないけど、
Shift_JIS に合致するモノは残す、という方針でいけないかな?
s/(([\w\d\xA1-\xDF\!\#\$\%\&\'\(\)\+\-\.\=\@\[\]\^\_\`\{\}\~]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])|(.))/\2/gm;
まるでEmacsLispでの正規表現見るような\の群れだな…
オブジェクト指向正規表現マダー?
>>777 だよね・・・
最初エスケープ付けずに書いてたんだけど、
どの文字がエスケープ不要でどの文字が必要かあやふやだったので、
いっそのこと、全てに付けた方がすっきりすると思ってあんなコードに・・・
問題: A と等価な正規表現になるように B を必要最小限エスケープして下さい (持ち込み不可)
A: /[\!\#\$\%\&\'\(\)\+\-\.\=\@\[\]\^\_\`\{\}\~]/
B: /[!#$%&'()+-.=@[]^_`{}~]/
>>779 /[\Q!#\$\%&'()+-.=\@[]^_`{}~\E]/
>>781 残念ながら間違い。ね、難しいでしょ?
よっぽど Perl に精通してるならともかく、そうでないのなら、
全てエスケープする、というルールの方がずっとシンプルで良いと思うんだけどなあ。
まあ、時と場合によって使い分けも必要かなとも思うけど。
で、正解は?
[^_`]/
/[!#\$%&'()+\-.=@[]^_`{}~]/
787 :
779 :2007/06/22(金) 17:30:13
>>784 すみません、出題しといてなんですが、私には難しくてわかりません。
エスケープしない派の方、教えて下さい。
こうかなあ?間違ってそうだなあ。
/[!#\$%&'()+\-.=@[\]^_`{}~]/
順番入れ換え可ならもっと短くなるかな。
/[]!#\$%&'()+.=@[^_`{}~-]/
実際に使えばすぐ分かるよ
なるほど。 すると、このスレで実際に使ってる人はあまりいないようですね・・・
逆にエスケープつけると演算子に変わるのがある。 sedの/\(A\)/はRubyの/(A)/と同じ。 sedの/(A)/はRubyの/(A)/と同じ。 だから、ムダにエスケープ付けるなが正解だし プログラム作る人の都合だからどっちが真実でもないw
ちょと打ち間違いw sedの/(A)/はRubyの/\(A)\/と同じ。
>>790 > だから、ムダにエスケープ付けるなが正解だし
正解と言えるかなあ?
Ruby を引き合いに出してるみたいだから言及するけど、
「記号を全て \ でエスケープする」というルールにしておけば、
Perl でも Ruby でも同じ正規表現が使える、という利点もあります。
めんどくさいルールを覚えなくてもとにかく全部 \ エスケープすればいい、
という仕様は lwall の優しさだと思っているんですが、どうでしょうか?
>>792 実際に使えば・・・、じゃなくて、実際にテストすればわかると思いますが、
$ や @ はエスケープしないと変数展開されてしまいますが、
エスケープしたらしたで今度は '\$' や '\@' というリテラル文字列として扱われ、
文字クラスに '\' が含まれてしまうことになります。
詳しくは perldoc perlre にそのものずばり書いてますのでそちらを参照ください。
ねえ、だから難しいんですってば。
あ エスケープしたら…以降読んでなかった 目ぇかっぽじって読むのは自分だった
謝るの忘れてた ごめん
794はツンデレ
>>793 メタ文字を、記号の場合はすべて\の前置なし、アルファベットは前置するとしたのは
lwallのえらいところだと思うけどね。
ブラケットの中では
・記号類のメタ文字無効
・] と - は置き場所によってはエスケープ不要
・delimiterによってjは / をエスケープする必要がある
・interpolationを防ぐため$ をエスケープしておいたほうが良い
てとこ?
Cのカッコと同じで、わかりやすくするためにつけたい奴はつければいいんじゃないの?
俺はそういうやり方は好かないどね。
> エスケープしたらしたで今度は '\$' や '\@' というリテラル文字列として扱われ、
> 文字クラスに '\' が含まれてしまうことになります。
> 詳しくは perldoc perlre にそのものずばり書いてますのでそちらを参照ください。
\も含まれてしまうというこれ再現しないんだが(ActivePerl 5.8.8)。
あとpetlreのどの辺りなのかも教えてくんなまし。
それらしいところが見当たらない。
文字コードで指定するんじゃだめなん? \xとか\uとか
>>798 > \も含まれてしまうというこれ再現しないんだが(ActivePerl 5.8.8)。
マジっすか?
漏れがテストに使ったコードを貼っておきます。
my $src = <DATA>; chomp($src);
my $exp = $src;
$exp =~ s/[\!\#\$\%\&\'\(\)\+\-\.\=\@\[\]\^\_\`\{\}\~]//gm;
my $dst = $src;
$dst =~ s/[\Q!#\$\%&'()+-.=\@[]^_`{}~\E]//gm;
print "EXP: [$exp]\n";
print "DST: [$dst]\n";
printf "%s\n", ($dst eq $exp) ? "OK" : "NG";
__END__
1A!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
> あとpetlreのどの辺りなのかも教えてくんなまし。
| You cannot include a literal "$" or "@" within a "\Q" sequence. An
| unescaped "$" or "@" interpolates the corresponding variable, while
| escaping will cause the literal string "\$" to be matched. You'll need
| to write something like "m/\Quser\E\@\Qhost/".
まて。 そりゃブラケットの外の話だろう。 ブラケットの中では、記号で表されるメタ文字は 二つの例外を除けば普通の文字だから \Qとか使う必要ないって。つか無意味。 逆にこれをしているせいで\もマッチするように なってしまっている。 perlreのversion 8 Regular Expressionの 三番目のパラグラフのあたりをよく読んでごらん。
えーと、「\Qとか使う必要ないって。つか無意味。」というのは同意です。 けど、 \Q...\E については、ブラケットの中でも効いていると思います。 \t とか \r とか \n とか \x1B とかも使えますけど、それと同等だと思います。 > Because patterns are processed as double quoted strings, > the following also work:
>>802 無意味っていったのは、効く効かないという意味でじゃなくてね。
s/[\Q!#\$\%&'()+-.=\@[]^_`{}~\E]//gm;
だと、\$ はそれぞれに対して\Qの効果が反映するから、\\\$になって
ブラケットの中に含まれる文字の中に\ も入るよ。
この\は$のエスケープのためにいれてんだから意味ないんじゃね?
つーことなんだけど。
[$] はエラーになるけど、[\$] はエラーにならなくて、かつ$は含まれていて
\は含まれない。ということで
>>793 で求めているものはこれでいいんじゃないの?
>perl -e "print qr<[\Q\$\E]>"
(?-xism:[\\\$])
>perl -e "print qr<[\$]>"
(?-xism:[\$])
>perl -e "print qr<[$]>"
Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE 5.008008/
長くなった。すまん、
エヂタの色分けでエスケープし忘れているかどうかをわかるようにすれば一挙に解決
UTF-8完全対応でegrepってまだだっけ? つか今出せば早期対応なのかな。
>>806 どういう意味で完全対応ってのを使っているのかわからんが、
GNU grep はUTF-8でもちゃんと動くぞ。
#grep -E でegrep相当の動作。もっとも egrep という名前でシンボリックリンクが
#作られてたりするけどね。
lgrep はダメなんだっけ?
lgrepはgrepでそ。
811 :
808 :2007/06/30(土) 13:25:22
>>810 egrep ではない (拡張正規表現は扱えない) と言いたかったんじゃないかな。
ハッキリそう言えば良いのに、と思わないでもないが。
ある文字列を含まないものにマッチする 正規表現の使い方教えてください。 $str = "sfhipsfpihosf"; #$str = "fdjsdfesfifoo"; print $str =~ /(?:(?!foo).)*/ ; 結果1になってしまいます。
:? やめて何にマッチしてるのか見ればいいのに
>>812 print $str !~ /(?:(?!foo).)*/ ;
「aという文字とbという文字とに挟まれた2桁の数字」 にマッチする正規表現が分からないので教えて下さい。aとbは含みません。 よろしくお願いします
816 :
815 :2007/07/01(日) 14:30:23
ID出しておきます
いいえ、出ません。
/(?:a[0-9][0-9]b|b[0-9][0-9]a)/
(?<=a)[1-9][0-9](?=b)
820 :
815 :2007/07/01(日) 14:51:01
>>817 出ませんね;;;
>>818 aとbも含まれてしまいました……
>>819 情報の後出しになってしまって申し訳ないのですが、
JavaScriptで使いたいのですが正規表現のエラーが出ました
821 :
815 :2007/07/01(日) 14:55:15
すみません、正規表現に頼らず出来そうなのでそちらでやります。 ありがとうございました
記憶によればJavaScriptは戻り読みが出来ない
>821 WScript.echo('fklsja89bfdlkj'.match(/a([0-9][0-9])b/)[1]);//必ずある場合 WScript.echo(('fklsja8df9bfdlkj'.match(/a([0-9][0-9])b/))?RegExp.$1:'null');//有るかどうかわからない場合
(?:[ab])(\d\d)(?:[ab])
明らかに角括弧余分だろ
>>825 「aという文字とbという文字とに挟まれた2桁の数字」
という質問に対しては、
anna
annb
bnna
bnnb
という組み合わせが考えられる
annb bnna どっちかだろ まあ既に解決したみたいだが
>>826 annaはbという文字にはさまれてないだろ。
サクラエディタって(?<=) これないの?
正規表現で二つ以上の改行をひとつでまとめる処理をしたいのですが、 どのように記述すればよろしいでしょうか? [\r\n]+ を \r\n で置換しようとしたところ、例えば三つ以上ある改行が 三つの改行に変換されるだけで変化が起こりません。
>>830 それで、使用している処理系も試したコードも晒さないのには何か理由でもあるのかね?
>>829 戻り読みか。
鬼車を使っているバージョンなら使えるはずだが、そうでなければ使えない。
Bregexp.dllでサクラエディタですが、 否定の先読みで改行のみの行も同時に省きたいとき、 ^(?!abc.+)\r\n ではだめで、 ^((?!abc).+)\r\n ならおkでした。なんで?
>>833 すまんが「改行のみの行『も』」というなら、どういう行をマッチさせたかったのか
書いてはくれまいか?
835 :
830 :2007/07/04(水) 21:13:35
サクラエディタで、使ってる処理系はWindows・・・です(この回答で合ってるかは不明) ------ a.txt ------- a b c ------------------ このようなファイルがあった時、改行が無駄なので ------------------ a b c ------------------ といった風に置換させたいのです。 試したやり方は置換前の文字列で [\r\n]+ 置換後の文字列で \r\n です。すみません、わかりにくかったらスルーしてください。
サクラエディタは複数行にわたる置換はできなかったはず。
837 :
831 :2007/07/04(水) 22:12:29
>>835 いや、その回答でおけ。
で、サクラエディタをインスコして試してみたけど、
>>836 の言うとおりみたい。
たとえば、
>>835 の例のテキスト (10行ある) で [\r\n]+ を「すべて置換」してみると、
「10箇所を置換しました。」って出るので、改行は一行ごとにしか処理できないっぽい。
手作業でやるんだったら、 [\r\n]+ ⇒ ##@@## に変換 ##@@##+ ⇒ \r\n に変換 でいけるべ。
839 :
835 :2007/07/04(水) 22:46:55
>>836-838 ありがとうございました。
>>838 様のレスでどうやら解決できたようです。
>>837 様におきましては、インストールしてまで試して頂いきお手間をかけて
しまって何だか申し訳ないです。しかしともあれありがとうございました(*´Д`)
840 :
833 :2007/07/04(水) 23:12:44
>>834 行頭がabcで始まらない全ての行全体。
自己レスだけど、内側の()は否定の先読み指定文字列で、外側はキャプチャ範囲かな
841 :
834 :2007/07/05(木) 02:21:41
>>840 ああ、そういうことね。
^(?!abc.+)\r\n
こっちだと、先読みに .+ を含めちゃっているので実際にマッチした文字列には反映されないでしょ。
^((?!abc).+)\r\n
こっちは先読みの外に .+ があるから、マッチには行頭から \r\nまでの内容がすべて含まれる。
先読みはマッチそのものの結果を得るだけでマッチした部分はどこにも残らないから。
phpで投稿された文字列が半角+改行コードのみかどうか調べたいのですが if(preg_match"/" ^[^a-zA-Z0-9]*$ "/"){全角も入ってるよ;} こんな感じでいいのでしょうか? この場合改行文字の扱いがされなさそうですが・・・
/[^[:print:]\r\n]/ とか
「:」も半角だけど
半角だけど、何?
鬼車をソフトに組み込もうと思ってるのですが 改行コードの\r\nを\nひとつみたいに振る舞えさせることってできますかね? たとえば .は\rにマッチしてしまいますがマッチしないように \nは\nだけにマッチしますが\r\nにマッチするように \sは\rと\n1個ずつマッチしていきますがいっきに\r\nにマッチするようにって感じです。
>振る舞えさせる 振る舞え……
>>846 USE_CRNL_AS_LINE_TERMINATOR
849 :
846 :2007/07/07(土) 15:01:31
>>847 振る舞わせるか
>>848 どうもありがとうございます、でも
USE_CRNL_AS_LINE_TERMINATORを有効にしてコンパイルしてみましたが
求めていたのとはちと違うみたいです。
どう違うんだろうと思ったが、USE_CRNL_AS_LINE_TERMINATORは $の挙動が変わるだけだっけ?
そりゃ一対一の文字ごとの置き換えでないかい? 正規表現でどうこうって話じゃないと思うが。 一部の言語でできる、置換部に関数を置くこととができるならそりゃまあ 書けなくもないだろうけど、そういうのはサポートしてないんでしょ? これ。
>>852 当該スレを紹介されるにいたった経緯など、詳細はこちらをご参照ください。
http://pc11.2ch.net/test/read.cgi/software/1183546269/200- 回答者の方が今のソフトでも正規表現で出来るとおっしゃいまして、自分なりに考えたのが、
A以降でBより前のあ→亜
A以降でBより前のい→井
・
・
・
B以降でAより前のお→オ
というように一つ一つ指定していく上で、“X以降でYより前”の部分を正規表現で
示せるのではないかというものなのですが、やはり不可能なのでしょうか。
置換部に関数を置くとの意味がどういうことなのか分からず、試しようがないので、
サポート外か、ヘルプに記述がないだけで使えるのかは判断がつきかねます。
>>853 これは素晴らしいです。事前のファイル名とパスの指定が多少面倒とはいえ、
100KBほどの大きなドキュメントの置換も問題なく、動作は申し分ありません。
正規表現とは違った形になりましたが解決しそうです。まことにありがとうございました。
>>854 直感的には、めんどい手順を何度も踏めば
正規表現置換でできると思われる
けど、やっぱり正規表現向きじゃないね。
回答者の人が君の質問を誤解してるか、
或いは正規表現の機能を誤解してるんだと思う。
>>854 (A[^Bあ]*)あ([^B\n]*[B|\n]) -> \1亜\2
こういうのを全文字分用意すればいけそうな気がするが、
めんどくさいからスクリプト使え。
855に同意。
>>855-856 面倒と言ってもその程度によりけりで、いったん定義ファイルを組んでしまえば、
後は次々放り込むだけで済むなら、最初に全文字分用意するくらい苦でもないのですが、
(1)「AあBあAああBああAあああBあああAああああBああああ」
(2)「A亜BアA亜亜BアアA亜亜亜BアアアA亜亜亜亜Bアアアア」
(A[^B]*)あ([^B]*B)→$1亜$2 では、それぞれAからBの間の後の一文字のみが変換され、
(A[^Bあ]*)あ([^B]*B)→$1亜$2 ですと、それが前の一文字のみになり、
(A[^Bあ]*)あ([^Bあ]*)あ([^B]*B)→$1亜$2亜$3 とすると、半端に前から二文字目までの上、
AからBまでにマッチする文字が二つに満たないグループがスキップされてしまいます。
置換箇所が0になるまで繰り返せばいいと言われればそれまでですけれども、
どうにかAからBまでの間の複数の置換を特定する方法はないものかだけが心残りです。
適材適所って言葉知らんのか。 明らかに正規表現にやらせる仕事じゃないだろ。
859 :
デフォルトの名無しさん :2007/07/11(水) 20:30:14
っつうかそこまでわかってるなら、 いい加減それがエディタの制約だってことに気づけ。 つまり、複数の置換を同時に行う機能が無いんだよ。
>>861 正規表現でやるこっちゃ無い。
ビットマスクでやったほうが圧倒的に速いし簡単。
ビットマスクじゃ範囲とってこれないだろ
865 :
861 :2007/07/11(水) 22:23:13
要件は
>>861 の通りなのですが、経緯も説明させてもらいます。
イントラのあるサーバにアクセスしてきた端末が固定かDHCPで割り
振られているかを判断する必要があり、DHCPサーバのconfigから
range設定を拾い、正規表現を作成 ⇒ grepをかける、
というような感じです。
range設定はビットやマスクではなく、
10.192.17.3 〜 10.192.18.20
のような正規表現を作成しようとしている側からすると凶悪な
設定がされてます。
自分はVBSとシェルスクリプト(awk、sed含む)がちょっとだけできる
ので、自分で正規表現ジェネレータを作成しようとしましたが、
まず設計の段階であまりの複雑さに頭がパンクしました。
だったら尚単純だろ。 IPアドレスは4byteの符号無し整数値に変換できるから大小比較すればそれで終わり。
っつうか仕事なら人に頼むな
868 :
861 :2007/07/11(水) 23:12:15
>>866 >IPアドレスは4byteの符号無し整数値に変換できるから大小比較すればそれで終わり。
それって、上で挙げたような"range設定を拾い、grepをかける"という事はできませんよね?
そういったプログラムを組め、と仰りたいのだと思いますが自分にはそこまでのスキルはありません。
アドレスレンジを正規表現にできれば汎用で使えると思い、時間をかけて調べていたのですが、
そういったツールは見つからず、またここで聞いてもわからない、という事であれば、存在
しないのだと思います。
レスしてくれた方ありがとうございました。
>>868 つくってくださいスレに依頼すれば。
いや、仕事なら自分でやったほうが本人のためか。
>868 その、グーグルのページのソースを見れば?、スクリプトで書いてあるじゃん。
>>868 >>870 の言うとおり、要件を満たすだけなら、
スクリプトで書いてあるのでそれを使えばよい。
だけど、正規表現にすると、さっきのアドレスレンジが
^10\.192\.(17\.([3-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))|((1[7-8])\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5])))|18\.([0-9]|1[0-9]|20))$
こんな文字列に置換されてしまう。
これでは何か起きたときの保守性が悪すぎる。
どうせスクリプトか何かを使うんでしょ?
設定ファイルに
10.192.17.3 - 10.192.18.20
とか書けばそれで動くように仕組みを作るべきだね。
(10.192.17.3|10.192.17.4|10.192.17.4| 略 | 10.192.18.20) みたいな正規表現を生成するのはOKなわけ?
ソース見てて疑問に思ったからちょっと動かしてみた。 これちゃんと動いてなくね?w 192.168.1.1〜192.168.2.9の範囲で出てきた ^192\.168\.(1\.([1-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))|(([1-2])\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5])))|2\.([0-9]))$ を使って、EmEditorで検索すると、192.168.2.20が引っかかるんだが。
とりあえず、一桁でやってみた。 49 235を引数で食わせたら、 ((49)|([5-9][0-9])|(1[0-9][0-9])|(2[0-2][0-9])|(23[0-5])) こういう出力が出せるようなのはできた
875 :
870 :2007/07/12(木) 03:22:28
|(([1-2])\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))) これが、余計だね。 確認もしないで、薦めてしまってすまん。
質問です。 小数点の書式が#0.###で 現在はこのようにしています。 ^[0-9]{1,2}[[\\.][0-9]{0,1}[0-9]{0,2}]?$ これだと1や11のように二桁の数字も弾いてしまいます 二桁以内.三桁以内にするにはどうすればいいでしょうか? また、01も弾きたいです よろしくお願いします
>>877 すいません忘れてました
XMLとJSPです
解決しました ただ、01のはじき方がわかりません
[1-9]?[0-9]
>>880 おおお、先頭に&で追加したら出来ました
ありがとうございました!
00 → 0 010 → 10 00・・・002301 → 2301 というように、数字の頭にある0を削るのはどうすればいいでしょうか?
s/^0+//;
>>883 それだと、
00 → ""
にならないですか?
s/^0+([1-9]|0$)/\1/;
>>885 それだと、010系がうまくいかないような。
マジで?
s/^0+([0-9])/\1/;
use strict; $_ = "010"; s/^0+([1-9]|0$)/\1/; print; # 10 $_ = "010"; s/^0+([0-9])/\1/; print; # 10
!?( ゚Д゚)
>>890 あれ?
Rubyでやっているのですが、こうなりました。。。
a = "010";
/^0+([1-9]|0$)/ =~ a;
puts $1; # 1
a = "010";
/^0+([0-9])/ =~ a;
puts $1; # 1
それは一番目のキャプチャを表示してるだけじゃん。置換しろよ。
>>893 了解しました。
置換するメソッドを探してみます。
(´・ω・`)
CHIKANCHIKAN - 痴漢メソッド ある一定の値(15から25)を持ち、かつメス属性を持った実体を過激に痴漢するメソッドです!!!!
つまんねえこと書くなオッサン
(?:0+?)([1-9][0-9]*) → \1 じゃだめなん?
ミスった ^(?:0+)([1-9]+[0-9]*|0) これでどうだろう
つかこれでいいのか ^0+([1-9]+[0-9]*|0)
>>872 =874?
わざわざ試作までして頂いたようで申し訳ありません。
>>869-875 質問の趣旨は、要件にあった物ががあれば、ちょっと教えてもらえないか、
という事であって、プログラムを書いて欲しいとまでは思ってませんでした。
自分はスキルが低いので何もお返しができませんし(汗)
今後は、似たような悩みがありそうなサーバ系のスレででも、別のアプローチで
質問してみます。
レスして頂いた方々、ありがとうございました。
すみません自分のレス番つけてなかったです。
>>900 gsubという置換メソッドを見つけましたが、その方法だと
>>892 のやり方でも
いけました。
どもです。
AAAAAA/BCD→AAAAAA BGD/HJL→BGD /より後ろの文字列を置換で削除(/も含む)したいのですがどういう表記にすればいいんでしょうか?
>>904 (.*?)/.* を \1 に置換
処理系によっては / は \/ にエスケープ。
>>905 即レスありがとうございます、置換できました
/.*を空文字置換ではいかんの?
普通はそうなる罠
>>901 作った。
自分のブログに上げたから、ブログ検索で見つけてくれ。
質問です 「切れる」「切れた」「切れす」「切れてん」「切れ、」にヒットして「切れ〜レス」にヒットしないような正規表現を作ろうと思い、 (?=.*切れ)((?=.*る)|(?=.*た)|(?=.*す)|(?=.*てん)|(?=.*、))^(?!.*レス).* というのを作ったのですが、これだと「切れ〜〜、」というものまでヒットしてしまって困っています。 「切れ〜〜、」にヒットせずに、「切れ、」にヒットするようにはどうすれば良いのでしょうか? よろしくお願いします。
lex的にやればできる。awkでもできそうだが。 "切れ([るたす、]|てん)" { printf("hit"); } "切れ.*レス" { /* ignore */ } . { /* ignore */ }
912 :
デフォルトの名無しさん :2007/07/15(日) 01:11:22
なんでlex? 普通に 切れ(る|た|す|(てん)|、) でいいだろ。
切れ([るたす、]|(てん)) のほうがいいか。
>>912 それだと 「切れるレス」 が問題になる
「切れ〜レス」だけは駄目ってこと? 「切れるレ」とかは?
自分のWindowsアプリに正規表現を組み込もうと思っていますが、どの既存のエンジンが みなさんのお勧めでしょうか??安定して、日本語を正しく処理できるエンジンがいいです。
よく見るのはBREGEXP.DLL 最近は鬼車じゃないの。 あとはライセンスじゃね? GPLな正規表現ライブラリ薦められて何も知らずに採用しちゃって・・・ なんてことがあっても誰も責任はとれんよ。
>>916 文字コードは?Unicode, Shift_JIS?
Boostの文字列操作ライブラリはshift-jisと相性良くないからな。 自分でトークンイテレータを作りこむ人にはアリな選択
文字コードはUnicodeでお願いします。Windowsの内部形式と同じUTF-16LEで。 BREGEXPか鬼車ですか。わかりました。調べてみます。
Unicodeなら、Bregexp.dllは使えないな。鬼車かBoostかな? 鬼車は置換処理は自分で書かないといけないので注意。 あとは、Bregexp互換で中身は鬼車のbregonig.dllってものもあるけど、 ベータ版のUnicode対応版が出てる。置換もあるけど、まー、ベータ版だから様子見かな。
>>915 「切れるレス」にヒットしなければいいです。
専ブラJaneのあぼーんで使いたいので、perl互換で作りたいのです。
>>910 の正規表現だと、「切れ、」と「切れ〜〜、」のどちらにもヒットしていしまい、この2つを区別したいのです。
例えば「切れないし、」は残したい場合でも、「切れ」と「、」が含まれるのでヒットしてしまうのです。
どうすれば解決できるのでしょうか?よろしくお願いします。
923 :
922 :2007/07/15(日) 06:48:52
書き忘れました。 情報小出しにしてすいませんでした。
しね
UTF-8 なら PCRE でも良くね?
単純な文字列マッチの性能は鬼車>PCRE 文字列固定の部分をBoyer-Moore法使って高速化してるからな。 Xpressiveもそうだっけな
>>922 手元に環境無いから試せないが
/切れ([るたす、]|(てん))(?!レス)/
では、どうか?
>>927 だめでした。
「切れ、」と「切れ〜〜、」は解決できているのですが、「切れるレス」にもヒットしてしまいました。
正規表現はxxを含まないというのを書くのに向いてないのに なぜ無謀にもやろうとする奴が後をたたないのだろうか...
NOT ○○を含む で実現すればいいのにねぇ
そうは言っても、ソフトがそれに対応していないとどうにもならんわけで。 (Janeはどうか知らんが)
>>928 そもそも Jane の正規表現って、Perl 互換なの?
あと、日本語をちゃんとサポートしてるのか?
Jane で使える正規表現を説明しているページ Plz
素朴な疑問だけど、正規表現に否定がないのはなぜ? !(正規表現) で(正規表現)にまっちしない文字列、みたいのが あってもよさそうなものじゃないかと思うのですが
>>932 JaneView.txtに
▼01101-040210RC1
▽正規検索ユニットを変更
・これまで使っていたRegExpRから、Windows/IE付属のRegExpオブジェクトに変更
・文法はPerl5互換(これまでと同じ)
・パフォーマンスは純粋な検索部分の速度で約2〜3倍に向上
・以前のユニットに戻すには、「設定」「設定」「その他」の「正規検索にWSHを使う」
をオフにして再起動
・環境の問題でWSHが使えない場合は、初回起動時に警告ダイアログが出て自動でオフに
設定されます(その場合、チェックボックスはグレーアウトされる)
※WSHで問題の報告がなければ、いずれRegExpRを取り除く予定です。
とありました。
日本語は使えてます。
>>933 まいっちんぐしない文字列を痴漢するときはどうするんだい?
というか、1文字の入力から状態遷移を繰り返してるから 入力から遷移先が決まらないものはダメなんじゃねえの
[^hoge]
正規言語の補集合も正規言語だから、!(正規表現)みたいのが なくても書けるので不要ということだろうな。でも与えられた 正規表現が受理する言語の補集合を受理する正規表現を書くのは 大変なので、そういうシンタックスシュガーがあれば便利かも?
grep -v 'regexp'
>>940 自分の無知を偉そうに自慢されても私たちに出来る事は何も有りません
>>934 確かに
> ・文法はPerl5互換(これまでと同じ)
って書いてあるけど
> Windows/IE付属のRegExpオブジェクトに変更
> ・環境の問題でWSHが使えない場合は
とも書いてあるので、細かいところまで Perl 互換かはちょっと怪しいな。
とりあえず
http://tehen.hp.infoseek.co.jp/abone/abone.html によると、
/切れ([るたす、]|(てん))[^レ][^ス]/
あたりは動きそう。
(行末とかが "切れる" とかなってるとちょっと不味いかも...。)
>>941 小難しい単語並べりゃいいってもんじゃないんだよ。
>正規言語の補集合も正規言語だから、!(正規表現)みたいのが
>なくても書けるので不要ということだろうな。
書いてみろ。
この作業が酷く大変なら、そういうシンタクスシュガーが無い理由もわかるだろ。
なんちゅう詭弁
>>943 特定文字列が含まれてるかどうか調べるなら
if( $pero =~ /kari/ ){print "バーロー\n";}
含まれていないことを調べるならその補集合で
if( !($pero =~ /kari/) ){print "ローバー\n";}
ってことを言っただけでしょ?
これだけじゃ超えられない表現もいっぱあるけどさ
クイックハックでパターンの先頭に1個「!」があれば否定にするようにしたことあったな。 実現方法は後察しの通り。
if( $pero !~ /kari/ ){print "バーロー\n";}
団子って何歳?
たしか40代だったな
永遠の12歳だお
36進法で。
縦読み厨うざい
print "バーロー\n" unless( $pero =~ /kari/ );
ここに書き込むのは気が引けるほどの、ど初心者なのですが質問させてください。
FirefoxのSearchBox Syncというアドオンを使っています。
これは検索した文字列を検索ボックスに自動的に挿入させるアドオンです。
これで適用させるサイトを増やしたくて、正規表現を見始めました。
そこで本題なのですが、
^
http://www\.amazon\.com?\.? (\w+)?/.*keywords=([^&]+)
と
amazon.*keywords=([^&]+)
では、どちらも検索語句を抽出できますが、どちらの記述の方がスマートな記述なのでしょうか?
なお、最後尾のグループに入る文字列が検索ボックスに挿入されます。
どちらがスマートかというより、上のほうが厳密で、下のほうは緩やか。 例えば下のだとamazon.co.jpのほうもマッチします。
>>956 上のも co.jp にマッチするというかマッチさせたいという話じゃないのかな?
できるよ 分かったら後は自力で頑張れ
>>959 レスありがとな!
今「サルでもわかる正規表現」ってサイト読んでるぜ!
961 :
デフォルトの名無しさん :2007/07/26(木) 10:52:33
&または行末 というつもりで[&$]と書いてもうまくいかない
行末は文字じゃないから
963 :
デフォルトの名無しさん :2007/07/26(木) 11:04:53
>>962 &または行末 という表現はどうかけばいい?
(&|$)
>>950 次スレはテンプレに「質問する香具師は実装言語・処理系を言え」を加えて立てといて。
よろしく。
()が必要なのか・・・無しで書きたいな・・・
なんで?
いや、なんでもない ?=を使えばいいのを忘れてた
そんなに正規表現による検索って需要あるのか?? だとしたら、俺のソフトにも追加してやるか。
いや、お前のには要らない。
そもそもお前のソフトが要らない
お前もいらない
俺もいらない
俺にはお前が必要
いらないのは俺だけ
おらだけいらね とりなしてくだせ
文章から特定の単語以外をすべて空文字に置換することはできますか?
979 :
977 :2007/07/28(土) 15:40:46
すいません。 サクラエディターもしくはEclipseのテキストエディターでできれば、と思います。
そのへん言わないやつらは全員perl準拠だと思えばいいよ 違う環境だったら死ねと言えば済むこと。
ヒドスw
まあ、結論だけ言うと出来ないよ。
>>977
サクラエディタマクロでWindowsSriptで否定の先読みが使ってやれ。 空文字ならnul文字だな。\c@だ。