• 締切済み

perlの正規表現で...

perlの正規表現で... abc (123) abc(123) からabcだけを取り出したいのですが、どのような正規表現になりますでしょうか? よろしくお願いします。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.6

予想外の追加条件がでてきてコメカミあたりが 緊張しましたが、もうないでしょうね? これから何時間かかけませんが できますよ。 本当にもう追加がないかよく確認してください

R2D2C3PO
質問者

お礼

その後 ([^\(]*)( *(?=\()|) で、なんとかできました。 皆さん、いろいろヒント下さり有難うございました。

R2D2C3PO
質問者

補足

度々お付き合い下さりありがとうございます。 >本当にもう追加がないかよく確認してください ありません、(、と思います、あってもいい加減、聞けません) 今後はもう少し質問の内容をまとめてからにするよう反省しています。

回答No.5

そろそろ条件が出揃ってると良いんですが… (- -;) '(' が2バイト文字の2バイト目に存在しない前提なら、非欲張り型を使って先頭から検索で ^([^\(]+?)\s*\( でできます。先頭^は環境とお好みで。 '(' が2バイト目に存在するような文字コードだったら?というマルチバイト部分の処理は、業務でもなければやりたくありません(笑)。

R2D2C3PO
質問者

補足

> マルチバイト部分の処理は、業務でもなければやりたくありません(笑) そういったレベルではないので、アドバイスいただいた正規表現で構わないのですが、前提としてカッコがない場合もあるので困ってます。 例えば、 補足は ありがとうポイントを発行する (回答を締切る) であれば、 補足は ありがとうポイントを発行する までで(カッコ前の空白は含めない) 補足は ありがとうポイントを発行する 回答を締切る ならば、最後まで全部 という具合にしたいのですが。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

・一行に複数の対象が含まれる可能性はあるか? ・行頭に空白がある場合その空白の扱いは? ・タブの扱いは? 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

R2D2C3PO
質問者

補足

有難うございます > 一行に複数の対象が含まれる可能性はあるか? > 行頭に空白がある場合その空白の扱いは? > タブの扱いは? ・ありません ・無視で ・タブ含まれる可能性はありません 今更ながらで恐縮ですが、文字列中にカッコが存在しない場合もあります。 カッコが存在すればその手前の文字列まで、かつ、カッコ前の文字列が空白ならばさらにその手前の文字列までとしたいところです。

回答No.3

・カッコの前までを取得 ・カッコの前には空白文字がいくらあっても良い ・取得する部分にはカッコとスペースは含めない を表現するんですから、 ([^\s\(]+)\s*\( とか。(\s : 空白文字) もしも関数名を拾いたいということでしたら、[^\s\(]の代わりに\wを使えば良いのでは。(\w : [a-zA-Z0-9_]と等価) (\w+)\s*\( などのように。

R2D2C3PO
質問者

補足

ありがとうございます。 取り出したい文字列には空白が含まれている場合もあり ([^\s\(]+)\s*\( とはできません。 abc( -> abc abc ( -> abc ab cd ef( -> ab cb ef ab cd ef ( -> ab cb ef という形にしたいのですが また、文字列は2バイト文字も含まれるので\wは使えません

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>文字列中にカッコがあった場合その手前までの文字列を切り出したい 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 こんなところで。

R2D2C3PO
質問者

補足

不特定の文字列の繰り返しという意味で、「abc」としましたが、分かりづらいようですいません。 また、カッコ内の文字列も同様に不特定でカッコが閉じられているかも不特定です。 .*(?= ?\() というのも試しましたが、この場合もやはり空白を拾ってしまいます。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

abcとは????? abc という固定文字列? aで始まりcで終わる英字列? 先頭から3文字? 英数字すべて? 先頭から開き括弧の直前まで? ・・・・

R2D2C3PO
質問者

補足

言葉足らずのいい加減な質問で申し訳ありません。 abcも123も任意の文字列で文字数も不特定です。 文字列中にカッコがあった場合その手前までの文字列を切り出したいのですが、 ([^\(]*) にするとカッコの手前の空白も拾うことになってしまいます。 カッコがあった場合その手前までで、かつカッコの手前に空白があった場合にはその空白の手前までとしたいのですが・・

関連するQ&A

  • (?:系の正規表現

    perlの正規表現で以下の意味は、ABC01かABC99のみマッチするということでよいでしょうか? /^ABC(?:01|99)$/ (?:は$1など使用しない場合に用いるで正しいでしょうか? (?系の正規表現について知識不足ですが、一覧や詳しい書籍がありましたら教えてください。 昔、 /^ABC01|99$/ とかいて、ABC99がマッチせず、99がマッチしたので、|を使うときは、()を書いたのですが$1など変に作用させたくなかったので、最近(?:系の存在を知ってもっと詳しく知りたくなりました。 (?:はPerlの正規表現特有のものでしょうか?

    • ベストアンサー
    • Perl
  • 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の正規表現で質問です。 例えば、 "aabbccddee"と"cdde"という2種の文字列があるとして"cdde"だけを検索(または置換)したい場合の正規表現ってどのようにすればよいのでしょうか? いま、"cdde"で検索すると"aabbccddee"と"cdde"の2種類がヒットしてしまうのですが"cdde"だけヒットするような正規表現をどなたかご教示ください。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • perlでの正規表現について教えてください。

    たとえば、 $A = 'aaa/bbb/ccc/ddd/eee/fff/ggg' というものがあったときにperlの正規表現でddd/のすぐ後の部分を抜き取って違う変数に入れたいのですが、それを正規表現で切り取りたいのですが、どうしたらいいかわからないです。 初歩的な質問ですが、お答えいただければ幸いです。 よろしくお願いします。

  • 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の場合でいいので、分かる方、教えてください。

  • 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で画像を縮小する部分は問題なく動作しています。 以上、宜しくお願い致します。

専門家に質問してみよう