- 締切済み
perlの正規表現で...
perlの正規表現で... abc (123) abc(123) からabcだけを取り出したいのですが、どのような正規表現になりますでしょうか? よろしくお願いします。
- R2D2C3PO
- お礼率46% (19/41)
- その他(プログラミング・開発)
- 回答数6
- ありがとう数1
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
予想外の追加条件がでてきてコメカミあたりが 緊張しましたが、もうないでしょうね? これから何時間かかけませんが できますよ。 本当にもう追加がないかよく確認してください
- beefisdead
- ベストアンサー率63% (92/145)
そろそろ条件が出揃ってると良いんですが… (- -;) '(' が2バイト文字の2バイト目に存在しない前提なら、非欲張り型を使って先頭から検索で ^([^\(]+?)\s*\( でできます。先頭^は環境とお好みで。 '(' が2バイト目に存在するような文字コードだったら?というマルチバイト部分の処理は、業務でもなければやりたくありません(笑)。
補足
> マルチバイト部分の処理は、業務でもなければやりたくありません(笑) そういったレベルではないので、アドバイスいただいた正規表現で構わないのですが、前提としてカッコがない場合もあるので困ってます。 例えば、 補足は ありがとうポイントを発行する (回答を締切る) であれば、 補足は ありがとうポイントを発行する までで(カッコ前の空白は含めない) 補足は ありがとうポイントを発行する 回答を締切る ならば、最後まで全部 という具合にしたいのですが。
- sakusaker7
- ベストアンサー率62% (800/1280)
・一行に複数の対象が含まれる可能性はあるか? ・行頭に空白がある場合その空白の扱いは? ・タブの扱いは? use strict; my $pat = qr<[^(]+(?= *\()>; while (my $line = <DATA>) { my @matches = $line =~ /$pat/g; print join(" : ", @matches), "\n" if @matches; } __END__ abc(123) abc (123) abcd(256) ab cd ef( ab cd ef ( 実行結果: abc abc abcd ab cd ef ab cd ef
補足
有難うございます > 一行に複数の対象が含まれる可能性はあるか? > 行頭に空白がある場合その空白の扱いは? > タブの扱いは? ・ありません ・無視で ・タブ含まれる可能性はありません 今更ながらで恐縮ですが、文字列中にカッコが存在しない場合もあります。 カッコが存在すればその手前の文字列まで、かつ、カッコ前の文字列が空白ならばさらにその手前の文字列までとしたいところです。
- beefisdead
- ベストアンサー率63% (92/145)
・カッコの前までを取得 ・カッコの前には空白文字がいくらあっても良い ・取得する部分にはカッコとスペースは含めない を表現するんですから、 ([^\s\(]+)\s*\( とか。(\s : 空白文字) もしも関数名を拾いたいということでしたら、[^\s\(]の代わりに\wを使えば良いのでは。(\w : [a-zA-Z0-9_]と等価) (\w+)\s*\( などのように。
補足
ありがとうございます。 取り出したい文字列には空白が含まれている場合もあり ([^\s\(]+)\s*\( とはできません。 abc( -> abc abc ( -> abc ab cd ef( -> ab cb ef ab cd ef ( -> ab cb ef という形にしたいのですが また、文字列は2バイト文字も含まれるので\wは使えません
- sakusaker7
- ベストアンサー率62% (800/1280)
>文字列中にカッコがあった場合その手前までの文字列を切り出したい 123は関係ないのですか? >カッコがあった場合その手前までで、かつカッコの手前に空白があった場合にはその空白の手前までとしたい ということなら use strict; my $pat = qr<abc(?= ?\()>; while (my $line = <DATA>) { my @matches = $line =~ /$pat/g; print join(" : ", @matches), "\n" if @matches; } __END__ abc(123) abc (123) abcd(256) abc(123),abc(234),abc(345) 実行例: abc abc abc : abc : abc こんなところで。
補足
不特定の文字列の繰り返しという意味で、「abc」としましたが、分かりづらいようですいません。 また、カッコ内の文字列も同様に不特定でカッコが閉じられているかも不特定です。 .*(?= ?\() というのも試しましたが、この場合もやはり空白を拾ってしまいます。
- notnot
- ベストアンサー率47% (4848/10262)
abcとは????? abc という固定文字列? aで始まりcで終わる英字列? 先頭から3文字? 英数字すべて? 先頭から開き括弧の直前まで? ・・・・
補足
言葉足らずのいい加減な質問で申し訳ありません。 abcも123も任意の文字列で文字数も不特定です。 文字列中にカッコがあった場合その手前までの文字列を切り出したいのですが、 ([^\(]*) にするとカッコの手前の空白も拾うことになってしまいます。 カッコがあった場合その手前までで、かつカッコの手前に空白があった場合にはその空白の手前までとしたいのですが・・
関連するQ&A
- perlの正規表現について教えて下さい。
perlの正規表現について教えて下さい。 【1】next if /^abc¥[1|2|3|4¥]/; 【2】next if /^abc¥[¥[1-4¥]¥]/; 例えばですが、 abc[1] abc[2] abc[3] abc[4] だった場合、next ifでスキップしたいと考えています。 【1】の場合、成功しましたが、【2】だとスキップされませんでした。 abc[ ではじまり、その後ろが「1、2、3、4」のいずれかで、]で閉じる場合、 スキップしたいと考えています。 【1】の場合、現在は[4]までだけですが、これが、[1]から[100]まであった場合, 1|2|3・・・99|100のように記述する事になってしまいますので 困っております。
- ベストアンサー
- Perl
- perlの正規表現について
perl初心者です。 早速ですが質問です。 複数のファイルが存在するフォルダ内にて、「~.abc.txt」というテキストファイルのみを 読み込みたい場合はどのように指定すればよいのでしょうか。 #open (F,○○)という表記になるかと思うのですが、 #適当な正規表現が分からず苦労しております。 お分かりになる方いらっしゃいましたら、ご教授してくださいませ。 以上です。 宜しくお願いいたします。
- 締切済み
- Perl
- perlでの正規表現について教えてください。
たとえば、 $A = 'aaa/bbb/ccc/ddd/eee/fff/ggg' というものがあったときにperlの正規表現でddd/のすぐ後の部分を抜き取って違う変数に入れたいのですが、それを正規表現で切り取りたいのですが、どうしたらいいかわからないです。 初歩的な質問ですが、お答えいただければ幸いです。 よろしくお願いします。
- 締切済み
- Perl
- Perlの正規表現
Perlの正規表現である文字列に文字列STRINGが含まれないようにするには ^(?!.*STRING).+$ と書くとググったら出てきました. ですが,?!について詳しいことまで書いてるサイトはありませんでした. ?!は具体的にはどのようなことをするのでしょうか?
- 締切済み
- その他(プログラミング・開発)
- Perlで使える正規表現を教えて下さい。
Perlで使える正規表現を教えて下さい。 半角英語で、小文字が3文字以上続いた後、大文字が来る場合、その大文字の右にスペースを入れる。 これをPerlで使える正規表現を教えて頂けないでしょうか? 例 $str = 'AaaAaaaBbbbbCccccDddBbA'; # Aaa Aaaa Bbbbb Ccccc DddBbA ちなみに、色々ネットで調べて試してみて、 $str =~ s/([a-z])([A-Z])/$1 $2/g; が最も近いコードになったのですが、2文字続いただけでもスペースが入り困っています。 宜しくお願い致します。
- ベストアンサー
- Perl
- Perl正規表現わかりますか?
下記のPerl正規表現ですが、どんな意味か分かるでしょうか? $var =~ s!/([^/]+|~(\.\.))/\.\./!/!g 参考書も読んでみたのですが分かりませんでした(セットされている文字列にどんなマッチング、置換をしているのでしょう) お分かりの方いれば、よろしくお願いします。
- ベストアンサー
- Perl
- 正規表現について(Perl5準拠)
HSPでプログラミングをしてるのですが、標準のHSPでは正規表現が使えないため、Perl5に準拠した正規表現が扱えるモジュールをインクルードして使っています。 正規表現初心者です。 プログラムのなかでファイのパスからファイル名だけにマッチするような正規表現を使いたいのですが上手くいきません。 具体的には c:円dir1円dir2円filename.xxxからfilename.xxxを抜き出すために ※円マークが質問に表示されないぬで「円」と書きました。 [^円]+$ という正規表現を考えました。意味は「円」以外の文字で始まる行末までの文字列という感じです。 「円」がメタ文字の為の記号だからダメなんでしょうか?自体を認識するためにはどのようにしたらいいのでしょうか? それとも正規表現がダメなんでしょうか? Perl5の場合でいいので、分かる方、教えてください。
- 締切済み
- その他(インターネット・Webサービス)
- Perlの正規表現
Perlの正規表現 Perlの正規表現で質問です。 MT4.13を使用して携帯用サイトを構築しています。 今現在、携帯用記事中の画像を縮小して表示しようと「regex_replace」を 使って、記事中のimgタグからsrc部分を抜き出して外部のphpに飛ばしています。 <$MTEntryBody regex_replace="/<img (.*?)src=\"(.*?\.jpg)\"(.*?)>/ig","<img src="phpスクリプト?img=\\2" border="0" />"$> 記事中のjpg(JPG)画像のsrc部分を拾って、phpに渡し、GDで縮小した画像を表示すると言った感じです。 しかし、regex_replaceの正規表現部分が上手く機能していないのか、jpg画像の最後の一枚のみ変換されると言った具合です。 JPG画像も含めて、記事中全てのjpg(JPG)画像を縮小して表示したいのですが、正規表現が思い浮かばず質問しました。 上記以外にも /<img (.*?)src=\"(.*)?(\.jpg|\.JPG)\"(.*?)>/ig などとしましたが上手くいきませんでした。 ちなみに、phpで画像を縮小する部分は問題なく動作しています。 以上、宜しくお願い致します。
- 締切済み
- Perl
お礼
その後 ([^\(]*)( *(?=\()|) で、なんとかできました。 皆さん、いろいろヒント下さり有難うございました。
補足
度々お付き合い下さりありがとうございます。 >本当にもう追加がないかよく確認してください ありません、(、と思います、あってもいい加減、聞けません) 今後はもう少し質問の内容をまとめてからにするよう反省しています。