- 1 名前:デフォルトの名無しさん [2011/03/26(土) 00:38:06.48 ]
- 正規表現(Regular Expression)スレです。
質問する場合は実装言語や処理系ソフトウェア名を示しておくと話が早いです。 正規表現 Part7 hibari.2ch.net/test/read.cgi/tech/1268979408/
- 809 名前:デフォルトの名無しさん mailto:sage [2011/11/27(日) 23:54:06.93 ]
- >>807
正規表現は原則よくばりなマッチ(とれるだけとる)をするんだけど、この原則をひっくり返したものが、.*?
- 810 名前:デフォルトの名無しさん mailto:sage [2011/11/28(月) 07:30:19.02 ]
- もしかしたら
「0個か1個」を意味するメタキャラクタの"?"で、どういう理屈で最短一致になるのか? という疑問かもしれん。 (量指定子)? という表現ひとまとまりで、最短一致を表す正規表現となる。そういう約束。 この場合の"?"は「0個か1個」を意味するメタキャラクタとは別物。 行頭を表す"^"と、文字クラス内で否定を意味する"^"とが別物であるようなもの。
- 811 名前:デフォルトの名無しさん mailto:sage [2011/11/28(月) 13:31:24.66 ]
- >>808
>>809 >>810 説明不足なのにエスパーしてくれた>>810さんの通りでした メタキャラクタの"?"とは切り離して考えないといけないんですね。 ありがとうございました!
- 812 名前:デフォルトの名無しさん mailto:sage [2011/11/29(火) 22:16:38.47 ]
- SoftalkWEBっていう2chスレ音声読み上げソフト使ってます。
そこで、 >>9 ↑ みたいにレスに返事をする部分を レス9へ返事 と変換したいのですが変換対象と変換結果をどのように指定すればよいでしょうか
- 813 名前:デフォルトの名無しさん mailto:sage [2011/11/29(火) 22:26:54.43 ]
- >>812
安価以外の「『>』×1〜2+数字」にも絶対反応するけどそれはどうするの?
- 814 名前:デフォルトの名無しさん mailto:sage [2011/11/29(火) 23:39:45.17 ]
- Javaでaaaa1.txt と bbbb2_2.txtというファイル名が有り、
aaaaと1、bbbb2_と2を抽出したい どう書いたらいい?
- 815 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 00:24:08.72 ]
- cccc22.txtだったらどうなればいいかとかいろいろ情報不足
- 816 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 00:42:50.28 ]
- 一応考えたのは
((^[a-zA-Z_\\-]+)|(^[a-zA-Z_\\-]+[\\-_]))(\\d+)\\.txt$ です
- 817 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 00:48:44.55 ]
- 訂正。2つめの[]の中に0-9を追加です
- 818 名前:815 mailto:sage [2011/11/30(水) 01:10:35.02 ]
- ファイル名の最後の数字と分けたいってことでいいのかなぁ。それなら
^(.*?)(\\d+)\\.txt$ で$1と$2に入る。これは検索対象がファイル名であることを前提にしてる書き方だけどね。 これじゃだめなら何が足りないのか書いてね。
- 819 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 01:50:36.80 ]
- >>812
アンカーにはさまざまなパターンが存在し、>>813氏も心配しているような誤反応の可能性がありますが、 シンプル版でよければ。 === 変換対象 (?<=\n)>>([1-9]\d{0,3})(?=[ ]) 変換結果 レス$1へ返事 === アンカーが行頭に存在し、かつ、 アンカーの後ろにスペースが入っている(SoftalkWEBの仕様)場合に置換します。 以下のように、番号を複数指定している場合などには未だ対応できていません。 >>1,2 >>1-2 また、>>1みたいな全角文字にも対応していません。 他のSoftalkWEBユーザの参考になるし、機能追加の要望にもなるので、 SoftTalkのサポート掲示板の方に投稿したほうが良いと思いますが、、、
- 820 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 02:39:22.37 ]
- janeの引用行着色の正規表現を使いまわせそう。
www42.tok2.com/home/proxo/rep/src/rs0033.rep
- 821 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 12:52:36.20 ]
- aの4回以上8回以下の繰り返し「 ^a{4,8}$ 」
ではなくて、 「aの4回または8回の繰り返し」 を ^(a{4}|a{8})$ のように「a」を2回使用せずに、「a」を1回だけ使用して指定する方法を教えてください。
- 822 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 13:04:10.09 ]
- ^(a{4}){1,2}$
- 823 名前:821 mailto:sage [2011/11/30(水) 14:36:25.94 ]
- >>822
ありがとうございます
- 824 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 16:21:29.66 ]
- ^(a)\1\1\1(\1\1\1\1)?$
- 825 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 16:58:17.47 ]
- ^((a)\2{3}){1,2}$
- 826 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 20:26:15.49 ]
- 質問です。
性器の生気を正規表現でどうしましょうか?
- 827 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 23:04:22.59 ]
- ^(a{4})\1?$
- 828 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 09:28:19.54 ]
- PHP Version 5.2.9
preg_matchです。 電話番号の認証として、 /^\d[\d\-]+\d$/D を使用していますが、 「1--3」のようなハイフン記号が続く場合の入力を許可してしまっています。 要件として、厳密な電話番号ルールは必要ではありません。 データとして「1-2-3」などを許可しています。 よろしくお願いいたします。
- 829 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 10:43:50.07 ]
- ^\d+-\d+-\d+$
- 830 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 12:25:11.03 ]
- ^(\d+-){2}\d+$
- 831 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 13:00:55.38 ]
- >>829
素直に書けばそういう感じですね。 目からウロコです。
- 832 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 13:22:51.62 ]
- 目からウンコ?
- 833 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 13:29:59.33 ]
- >>830
こちらを使用します。 ありがとうございます。
- 834 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 14:36:15.33 ]
- 正規表現は短ければいいってものじゃないからな、一応。短く書いたほうが処理が重くなるケースは多々ある。
- 835 名前:814 mailto:sage [2011/12/01(木) 15:05:13.05 ]
- >>815
アク禁で遅くなりました ありがとう
- 836 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 21:01:27.69 ]
- asdfg =~ /a|s|d|f|g/
こういうのが一番はやい。/(a-z)/より早い。でもめんどくさい。
- 837 名前:デフォルトの名無しさん [2011/12/03(土) 20:22:32.94 ]
- こ う い う 風 に ス ペ ー ス を 間 に 何 度 も 挟 む
ケ ー ス を 正 規 表 現 で や る と ど う す れ ば い い の か な
- 838 名前:デフォルトの名無しさん mailto:sage [2011/12/03(土) 20:28:51.44 ]
- マッチさせたいってこと?
([^ ] )+
- 839 名前:デフォルトの名無しさん [2011/12/03(土) 20:34:55.37 ]
- あ、なるほど!
- 840 名前:デフォルトの名無しさん mailto:sage [2011/12/03(土) 23:12:53.30 ]
- おい!!次スレがこの有様なのか?
hibari.2ch.net/test/read.cgi/tech/1322908056/l50
- 841 名前:デフォルトの名無しさん [2011/12/05(月) 16:10:59.60 ]
- ●正規表現の使用環境
C# ●検索か置換か? 検索して、マッチしたものをキャプチャして置換したい。 ●説明 文字列の演算式の項をキャプチャして置換したい。 演算子には、+,*,()のみが使用可能。括弧の入れ子も可能。 ●対象データ(ex.) (aaa+bbb)*(ccc+ddd) があったとき、まず、aaa,bbb,ccc,dddをキャプチャして、 文字列変換(別途用意済)をする。 次に、それぞれ変換した文字列を元の式に戻す。 例えば、文字列変換が小文字⇒大文字への変換だった場合、 (AAA+BBB)*(CCC+DDD) としてたい。 実際には、 string strBefore = "aaa"; string strAfter = 変換メソッド(strBefore); という感じで、独自の変換メソッドを用意しています。 aaa*(bbb+ccc) ⇒ AAA*(BBB+CCC) aaa*((bbb+ccc)+ddd) ⇒ AAA*((BBB+CCC)+DDD)
- 842 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 16:45:57.87 ]
- 正規表現使う必要無くね?
- 843 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 17:15:20.40 ]
- ただのstrupr処理だわなw
- 844 名前:841 [2011/12/05(月) 17:27:54.69 ]
- >>843
struprはあくまで例です。 ここで複雑な変換処理の式を出しても混乱するだけだと思ったのでupperを出しただけです。 >実際には、 >string strBefore = "aaa"; >string strAfter = 変換メソッド(strBefore); >という感じで、独自の変換メソッドを用意しています。 ここで事情は説明したつもりなのですが・・・
- 845 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 17:42:16.92 ]
- ふつう正規表現でやるのは項の定義止まりだよ
- 846 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 17:46:12.47 ]
- 説明を簡略化しすぎても混乱してしまうよ。それと求めているのは正規表現そのものではなくて
正規表現のサンプルコードか何かのような気がするのだが・・。
- 847 名前:841 [2011/12/05(月) 18:16:25.27 ]
- >>846
すみません、たしかにロジックの説明は余計だった気がします。 教えて頂きたい正規表現は、四則演算「っぽい」文字列にマッチするかどうかというものです。 マッチさえすれば、あとはキャプチャして置き換えればよいとの認識です。 宜しくお願い致します。
- 848 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 18:31:39.00 ]
- もとの制限を考えれば、+,*,() 以外の文字の連続がほしいものなんじゃないの?
- 849 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 22:23:58.80 ]
- >>844
文字列の中に式らしき部分があって、その要素(項)を別に定義した約束事で 置換するというのでいいのかな。
- 850 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 22:50:20.98 ]
- >>842は>>843的な意味で書いたのではなく、文字列操作関数だけでも出来るんじゃないかと思ったので書いた。
正規表現でやったほうが楽だけどね、処理速度は遅いけど。 ・項にはどんな文字が使われるのか、英字だけなのか、ひらがなや漢字、数字なども含まれるのか 例、時間*時給 (これがはっきりしないと書きようが無い) ・式の前後には改行は入っているのかいないのか ・全角文字には対応するのかしないのか 例、F+G これらが分かれば簡単に書けるから誰かしらが作ってくれると思うよ。
- 851 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 22:54:13.82 ]
- あ、括弧の入れ子を厳密に判定しようと思ったら普通の正規表現では無理。鬼車っていうライブラリを使ってるなら
簡単に対応出来る。鬼車でない場合は文字列操作関数で頑張ったほうが正確に判定出来ていいかも。
- 852 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 23:07:39.25 ]
- 使われる全ての文字の連続を検出すれば良い。
括弧が正確に対応するかは個別にCheck。正規表現使わなくていい。
- 853 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 23:07:41.69 ]
- >>851
括弧の入れ子とか別に関係ないじゃん?
- 854 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 23:23:12.62 ]
- >>853
((((aaa+bbb)*ccc(ddd) こういう括弧の数が合わないものは式でない可能性が高い。それを置換してしまってもいいのかな?
- 855 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 23:35:58.54 ]
- >>854
それを考慮するってことは、式の始まりまたは終わりを判断するつもりがあるということか。
- 856 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 23:44:00.41 ]
- それをしなかったら正規表現使う意味なくない?
- 857 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 02:48:57.24 ]
- だから正規表現いらなくねって意見がでてんでしょ
- 858 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 06:28:53.19 ]
- 括弧の入れ子の判定は正規表現でやったほうが断然楽だわな。いらないと思う人はこれが出来ない人なんだろう。
- 859 名前:841 [2011/12/06(火) 08:54:43.49 ]
- >>850
ご指摘ありがとうございます。 項はある検索エンジンで使用する独自の式が入ります。 "TERM"という定数に項を表す正規表現が記述されている、として頂ければと思います。 const string TERM = "●●"//●●←項を表す正規表現 式の前後に改行は入りません。 全角文字は、項の中ではありますが、+、*、(、)は半角のみを許可します。 よろしくおねがいします。
- 860 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 09:23:04.74 ]
- 難しい問題の合間に箸休めでお答えください
数字の入っているファイル名を置換したいです。 あああいいい01.txt AABB0002.txt なむなむ003.txt TYTY4.txt ↓ THX001.txt THX002.txt THX003.txt THX004.txt .+(\d)(\d?)(\d?)(\d?)\.txt などと、いろいろ試してはみたんですがうまくいきません。 どうかお力添えのほどをよろしくお願いします
- 861 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 11:33:14.28 ]
- >>860
.+(\d)+\.txt こういうこと?
- 862 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 11:43:15.81 ]
- >>851
鬼車つかって簡単に対応したのを書いてもらえますか
- 863 名前:860 mailto:sage [2011/12/06(火) 17:48:58.84 ]
- >>861
レスありがとうございます。 条件をもう少しちゃんと書けばよかったですね 数字部分が0255などの時うまく置換できないのです。 数字部分だけで言うと、001,002,・・,255,・・880 のような形で置換したいです。 置換の方への記述の仕方もよくわからず、できればそちらもお願いいたします
- 864 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 18:02:07.72 ]
- >>863
>>4
- 865 名前:860 mailto:sage [2011/12/06(火) 18:28:08.59 ]
- >>864 失礼しました
●正規表現の使用環境 psstpsstというリネームソフト(Perl互換) ●検索か置換か? 置換 ●説明 最大4桁で書かれた数字部分を3桁に統一したい ●対象データ ABCA01.txt BCAA2.txt CABA0255.txt ●希望する結果 AAA001.txt AAA002.txt AAA255.txt どうぞよろしくおねがいします
- 866 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 20:38:24.42 ]
- 数字部分を3桁以上にしてから
(\d+\.) 000\1 下3桁だけ切り出し \d*(\d{3}\..*) \1
- 867 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 22:41:35.61 ]
- >>841のは再帰を理解できるような拡張した正規表現を使えないとダメだろ。
そんなのあるのか。
- 868 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 22:48:48.50 ]
- PCREは無限の括弧の対応が取れる ~ 再帰も、ネストも、あるんだよ.
swatmac.info/?p=716 正規表現の限界 @ Shibuya.pm swatmac.info/etc/shibuya_pm/pix/recursive-regex.png swatmac.info/etc/shibuya_pm/
- 869 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 23:22:37.09 ]
- で、再帰が使えると>>854が懸念するようなことも解決できるの?
- 870 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 23:35:32.29 ]
- 理解してないができるはずだろ。マッチしないとき、括弧が足らないなどのエラーが判明する。
再帰的パターン どうすればカッコに括られた文字列とマッチできるか、という問題を 考えて見ましょう。 このとき、カッコは何回でもネストできるとします。 再帰が使えないとすると、パターンを用いて、せいぜい、ある一定の深さの ネストまでしかマッチできないでしょう。 任意の深さのネストを 処理することは不可能です。 Perl 5.6 では、正規表現において再帰を行う 実験的な機能が導入されています。 PCRE では、再帰という特殊なケースに対して専用のシーケンス (?R) が導入されました。 php.net/manual/ja/regexp.reference.recursive.php
- 871 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 23:46:03.39 ]
- 出来るよ、このスレでこんな認知度低いほうが意外なくらい。
- 872 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 23:58:07.19 ]
- windowsで手軽にpeclの動作確認する方法ありますか。
- 873 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 00:00:50.43 ]
- xampp入れてPHPですかね。
- 874 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 00:03:36.96 ]
- 認知度の話じゃなくて、項には全角も含まれるといわれている状態で、再帰でできるとか言ってるのが斜めってることに気づかないのかな。
「たとえばほげほげ+fooという文字列」 ↑この中の項をどうやって判別するの。
- 875 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 00:07:35.69 ]
- 全角や、英数のみはたいした問題でない。
どの文字を許可するかはそのつど変わる。
- 876 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 00:12:27.18 ]
- だから現状ではできない、でおk?
- 877 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 00:18:13.56 ]
- なんでよ?
文字コードの問題があるけど、たとえばUTF32などだったら英数も全角も同じバイト長で区別はない。
- 878 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 00:23:06.12 ]
- >>877
>>855でも書いたけど、式の始まりと終わり、項と項以外をどうやって判断するの? 体重+年齢と性別*5 このとき、何が項として抽出されるべきかを書いてみ? べつに>>874でもいいけど。
- 879 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 00:25:53.18 ]
- 項に使える文字はあらかじめ指定するんだろ。
たとえば[0-9a-z]としてあとで変更することもできる。 全角になったとしてもたいした問題でない。
- 880 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 00:26:54.45 ]
- >>878
こうわけるのが普通だろ。他にどう分けるんだよ。 体重 + 年齢と性別 * 5
- 881 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 00:29:23.51 ]
- 対象文字列が式のみかどうかなんて書いてないよな。
- 882 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 00:31:54.36 ]
- 対象文字列が式のみであるという前提を勝手につけるなら、わざわざ括弧の整合性チェックをする必要なんてないよな。
- 883 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 01:05:10.14 ]
- >>882
いつまで雑魚の相手をするつもりなんだ?
- 884 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 01:12:28.09 ]
- >>841
正規表現はマッチするだけ。置換処理はプログラミングの分野。はき違えてはいけない。 ideone.com/2xlKW
- 885 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 01:24:06.45 ]
- 項の部分は質問者さんが正規表現を作るのかな、>>859を読むとこう取れなくもないのだが。
>>850で「はっきりしないと書きようがない」と言われてるのにはっきりさせないから混乱するんだ。
- 886 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 01:53:13.54 ]
- 項は仮に[a-z0-9]でいいだろ。
- 887 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 04:54:20.90 ]
- >>884
そんな手間かけてゴミレス付けんなよ。
|

|