• 締切済み

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% (4900/10358)
回答No.1

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

R2D2C3PO
質問者

補足

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