トップページ⇒tech
1001コメント322KB

正規表現 Part8

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2011/03/26(土) 00:38:06.48
正規表現(Regular Expression)スレです。

質問する場合は実装言語や処理系ソフトウェア名を示しておくと話が早いです。

正規表現 Part7
http://hibari.2ch.net/test/read.cgi/tech/1268979408/
0951デフォルトの名無しさん2011/12/09(金) 22:03:58.64
>>934,936
正規表現についてそのような小手先技を極めるよりも、本質的に正規表現はプログラム目的でもないしそのような言語でもないってことをまず理解した方がいい
0952デフォルトの名無しさん2011/12/09(金) 22:38:02.19
生産性と品質を上げられるなら使うべき。
プログラム組んだ方が速くて簡単ならそっちがいい。
0953デフォルトの名無しさん2011/12/09(金) 22:59:48.66
スレ的には正規表現の理解が深まるなら
小手先でも生産性が低くても別にいいじゃない
今回みたいに反面教師にもなるわけだし
0954デフォルトの名無しさん2011/12/09(金) 23:15:21.08
正規表現とプログラミング(のための言語)との区別があいまいで両者一体不可分だったのはunix shellとperlの時代(1998年頃まで)で終わった。
0955デフォルトの名無しさん2011/12/10(土) 01:03:53.46
●正規表現の使用環境
C#

●検索か置換か?
置換

●説明
文字列の中間にある数字を検索して置き換えたい。

●対象データ(ex.)
hogehoge-123.txt → hogehoge-num.txt
hogehogex-123.doc → hogehogex-num.doc
0956デフォルトの名無しさん2011/12/10(土) 01:10:35.52
>>955
まず、「文字列の中間」を定義してください
0957デフォルトの名無しさん2011/12/10(土) 01:13:13.87
文字列の中間というのは拡張子の直前の-の次にある数字です。
この数字があるかないかの確認はすでに済ませてあります。
0958デフォルトの名無しさん2011/12/10(土) 01:16:46.27
>>955
検索: -\d+\(?=.[a-z\d]+$)
置換: -num
0959デフォルトの名無しさん2011/12/10(土) 01:17:29.01
s/(.*-)\d+(\.[^.]+)$/\1num\2/
09609582011/12/10(土) 01:20:23.66
>>958
エスケープを忘れてた
検索: -\d+\(?=\.[a-z\d]+$)
置換: -num
0961デフォルトの名無しさん2011/12/10(土) 01:36:26.03
できました!
ありがとー!
0962デフォルトの名無しさん2011/12/10(土) 07:35:12.31
対象
ABCこの間に文字列があったりなかったりDEF

結果
DEF

"ABC"よりも後続にある(最初の)"DEF"だけを対象としたいです
戻り読み条件が、長さ一定でなくてもOKならばできるのですが・・・
0963デフォルトの名無しさん2011/12/10(土) 08:48:42.15
>>962
ABC.*?(DEF)
0964デフォルトの名無しさん2011/12/10(土) 09:04:23.43
>>962
ABC.*?\KDEF
0965デフォルトの名無しさん2011/12/10(土) 09:38:11.06
つ 正規表現の入門書
0966デフォルトの名無しさん2011/12/10(土) 10:09:40.90
>>965
つ\s+正規表現の入門書
0967デフォルトの名無しさん2011/12/10(土) 13:20:46.81
\Kって、なにで使える?
0968デフォルトの名無しさん2011/12/10(土) 13:56:35.94
>>966
[⊃|つ]\s+正規表現の入門書
0969デフォルトの名無しさん2011/12/10(土) 14:28:53.54
>>967
可変長の戻り読みが可能で(\Kより前をマッチ文字列に含めない)、置換操作で同じ文字列の置換をさせないことができる

s/(foo)bar/$1/g
s/foo\Kbar//g
0970デフォルトの名無しさん2011/12/10(土) 14:59:24.06
どういう環境で使えるのよ
0971デフォルトの名無しさん2011/12/10(土) 16:15:10.95
>>967
Perl 5.10以降とかpcreとかboost regexとか。
あとは>>192とか。サクラエディタではまだうまく動かないんだっけ?
0972デフォルトの名無しさん2011/12/10(土) 16:47:26.37
pcreって鬼車じゃないの?
0973デフォルトの名無しさん2011/12/10(土) 16:51:02.92
>>972
別物だろ。
0974デフォルトの名無しさん2011/12/10(土) 18:29:05.11
それはない。
中身のことだろ?
0975デフォルトの名無しさん2011/12/10(土) 22:34:32.09
>>951>>953
こういう馬鹿って何のために生きてるんだろうなぁ。
0976デフォルトの名無しさん2011/12/10(土) 23:00:08.72
>>975
ところでおまえは何のために生きてるんだ?
0977デフォルトの名無しさん2011/12/10(土) 23:20:49.65
世界の発展に貢献するため
0978デフォルトの名無しさん2011/12/10(土) 23:24:10.29
マッチさせるだけだと面白くないなぁ。
http://ideone.com/clone/ej7Xf
0979デフォルトの名無しさん2011/12/10(土) 23:27:34.36
こんばんわ、近藤正彦といいます

みなさん、私の事をマッチと呼んでくさ(ry
0980デフォルトの名無しさん2011/12/10(土) 23:29:23.82
Googleは世界の発展に貢献するために日本も含む世界各国で違法行為を行って問題になっています
0981デフォルトの名無しさん2011/12/10(土) 23:30:13.03
彼らは世界を革命するために日夜デュエルを行っています。
0982デフォルトの名無しさん2011/12/10(土) 23:33:17.65
こんな過疎スレでも次スレが必要だとは思わなんだ...
0983デフォルトの名無しさん2011/12/10(土) 23:34:20.56
ハッテンさん次スレおねがい
0984デフォルトの名無しさん2011/12/10(土) 23:35:58.63
次スレ?


http://hibari.2ch.net/test/read.cgi/tech/1322908056/l50
0985デフォルトの名無しさん2011/12/10(土) 23:36:10.99
次の次はずっと俺のターン!
0986デフォルトの名無しさん2011/12/11(日) 00:07:09.56
>>979
s/近藤[  ]*?正彦/マッチ/g
0987デフォルトの名無しさん2011/12/11(日) 00:26:56.15
>>937
C#を初めて使った。括弧対応取れるだけの気がする。
http://ideone.com/CwPky
0988デフォルトの名無しさん2011/12/11(日) 01:08:01.91
>>955とかも841の質問なのかな、遠回りな質問の仕方をするからみんなが迷惑するんだよ。
基本的な学習すらしないで人に聞いて済まそうという姿勢は頂けない。
0989デフォルトの名無しさん2011/12/11(日) 02:35:31.34
パーサジェネレータ

bison(バイソン)とは構文解析器を生成するパーサジェネレータの一種であり、CコンパイラとしてのGCCのサポートのために[要出典]開発されたフリーソフトウェアである。
http://ja.wikipedia.org/wiki/Bison


ANTLR(ANother Tool for Language Recognition)とは、LL(k)構文解析を用いたパーサジェネレータである。
http://ja.wikipedia.org/wiki/ANTLR

Coco/R は、対象となる言語の属性付き文法を入力とし、その言語の字句解析器と構文解析器を生成するパーサジェネレータである。
http://ja.wikipedia.org/wiki/Coco/R
0990デフォルトの名無しさん2011/12/11(日) 02:58:24.83
次スレ梅
09918512011/12/11(日) 06:42:36.51
>>841
(?!(?>\(+\g<項>\)+)(?!\g<演>)|(?>\g<項>)(?!\g<演>))(?<!\(|\g<演>)(?:\g<項>|\g<カ>)
(?>(?:\g<演>(?:\g<項>|\g<カ>))*)(?!\g<演>|\))(?<項文字>
[^\x00-\x20\-+*/=()<>]
){0}(?<項>(?<!\g<項文字>)(?>\g<項文字>
{1,30}
)(?!\g<項文字>)){0}(?<演>[\+\*]){0}(?<カ>\((?:\g<項>|\g<カ>)(?:\g<演>(?:\g<項>|\g<カ>))*\)){0}

3行目で項に使える文字を設定出来ます。↑の設定では以下の文字を使えなくしてます。

・アスキーコード表での16進数の00番から20番までの文字(改行や半角スペースなど)
・-、+、*、/、=、(、)、<、> の9文字

他に項の文字として含まれては困る文字があったら [^ ] の中に追加していって下さいね。

例、[^\x00-\x20\-+*/=()<>あいうえお] ← あいうえおの5文字が項を構成する文字から追加で除外されます。

5行目では1つの項の文字の長さを設定出来ます。上の設定では1文字以上30文字以下に設定してあります。
09928512011/12/11(日) 07:21:44.82
>>937
>項には1-9の数字一桁だけとして([1-9])
>>991の3行目で項に使える文字を設定します。この場合は3行目を↓に書き換えるだけです。
[1-9]

[^ ] とすると"使えない"文字の設定になります。
[ ] とすると"使える"文字の設定になります。

>項のC_TERMについてはどうすればいいでしょうか?
>>991の正規表現は式全体にマッチする正規表現です。この正規表現で式全体を取り出し、項の部分がC_TERMに
マッチするかをテストして下さい。

今回の場合、項以外の文字は(、)、+、*の4文字だけなので、それ以外の文字列が項です。
↓の正規表現で項が1つずつ取り出せます。
[^()+*]+

取り出した文字列がC_TERMにマッチするかテストするコードを書いて下さい。すべての項がC_TERMにマッチすれば
照合完了です。C_TERMにマッチするかテストすると同時に置換もすれば目的達成です。

>>939
>ERROR: undefined group option
今回の正規表現では<項>など、グループの名前として漢字を使っていますが、C#では半角文字しか
認識出来ないのかも知れません。代わりに<TERM>などのように半角文字の名前に書き換えると動くかも知れません。

>サンプルコード
C#の環境はないので申し訳ないけど他の方にお願いしてみて下さい。^-^;
0993デフォルトの名無しさん2011/12/11(日) 10:21:22.31
正規表現 Part9
http://hibari.2ch.net/test/read.cgi/tech/1323566370/
0994デフォルトの名無しさん2011/12/11(日) 10:43:31.79
>>993
おつうめ
09959392011/12/11(日) 14:59:18.55
>>992
できました。
C#じゃなくてCなんですけどね^^;;;
09969392011/12/11(日) 15:01:04.31
うそつきました。
ONIG_SYNTAX_PERLにするとエラーが出ることには変わりなかったですorz
> r = onig_new(®, pattern, pattern + strlen((char* )pattern),
> ONIG_OPTION_DEFAULT, ONIG_ENCODING_UTF8, ONIG_SYNTAX_PERL, &einfo);
こうじゃないってことですかね。
0997デフォルトの名無しさん2011/12/11(日) 15:01:38.98
うめる
0998デフォルトの名無しさん2011/12/11(日) 15:13:00.61
>>996
ONIG_SYNTAX_PERL_NGだろ?
09999392011/12/11(日) 15:15:22.79
>>998
動きました!
>>934で
> 鬼車のオプションはONIG_SYNTAX_PERLで。大文字小文字の区別は無しで。
と書かれていたので><

ありがとうございました
1000デフォルトの名無しさん2011/12/11(日) 15:17:33.71
1000
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。