出産前後の痔にはご注意!

こんにちは。
タイトルの通りなのですが

$test = 'aaa="bbbccc"ddd';
のbbbcccだけを抜き出したいので、

if ($test =~ /aaa=\"(.+)\"/) {
$test= $1;
}


と正規表現を利用して実行してみましたがうまく動作しません。

確定してるのは aaa="この間の文字列"の形で、
aaa=ダブルコーテーション ダブルコーテーション
は固定なのです。

そのようにな文字列から特定の個所を抜き出すように実装するには
どのようにすればよろしいのでしょうか?

どなたかご存知の方、よろしくご教授ください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

 細かい点ですが


>正規表現を利用して実行してみましたがうまく動作しません。
 と有りますが、実際にでた結果を書いていただけると
回答がしやすいです。
 実際は貴方が書かれているやり方でもとれていると
思うのですが…。

 基本的に私が普段、使うときには
if ($test =~ /\"(.*?)\"/) {
$test= $1;
}
を使用しております。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

そうですね、おっしゃる通りですね。
今後気をつけたいと思います。

お礼日時:2004/09/16 12:09

$test = 'aaa="bbbccc"ddd';



if ($test =~ m/\"(.*)\"/) {
$new_test = $1;
print $new_test. "\n";
}

で取得できましたよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。
とても参考になりました。

お礼日時:2004/09/16 12:07

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q正規表現で囲まれた部分の文字列

正規表現でダブルコーテーションで囲まれた部分の文字列
を検索したいのです。
\"([^\"])*\"
とりあえずこんな感じで検索はできるのですが
問題はダブルコーテーションで囲まれた部分の
エスケープ文字\の判定が上手くできません。
([^\"])
この部分でダブルコーテーション以外の文字列、
ただし\"は除くって感じにしたいのですがどうすれば良いでしょうか。
宜しくお願いします。

正規表現のエンジンはBREGEXP.DLLです。
http://www.hi-ho.ne.jp/babaq/bregexp.html

Aベストアンサー

([^\"])

(\\\"|[^\"])
としたらでどうでしょうか。

QPerlで文字列の切り出しをするには?

おせわになります。

Perlであるパターン間の文字列を取り出す方法はあるのでしょうか?例えば、"Monday<From>Thursday<To>Friday"という文字列の<From>~<To>間、つまり"Thursday"を取り出したいのですが、うまくいきません。
できればパイプでつないでいくために、以下のような正規表現でかければ最高なのですが…

echo 'Monday<From>Thursday<To>Friday' | perl -e '○○○○'

もう1週間以上ここではまっています。Perlってはまると長いです…

Aベストアンサー

こんな感じ

echo "Monday<From>Thursday<To>Friday" | perl -pe"s/.*<From>(.*)<To>.*/$1/g;"

Q、"(ダブルクォーテーション)で囲まれている文字列を正規表現で取得

質問させてください。

abcdef -s "xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh" asdakjsd

のような文字列があります。
これの、"(ダブルクォーテーション)で囲まれている文字列を取得したいのですが、正規表現がうまくいきません。
取得結果としてはは、xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh の部分がほしいです。

preg_match('/"([.*])"/', $str, $matches);とやったり
preg_match('/\"([.*])\"/', $str, $matches);とやったり
preg_match('/\"([.*?])\"/', $str, $matches);とやったりしたのですが、
どうしても$matchesにほしい結果は入っていません。

どのような正規表現で取得可能でしょうか?

何卒ご教授ください。

Aベストアンサー

preg_match('/"(.*?)"/', $str, $matches);
でよいのでは?

Qダブルクォーテーションを含む正規表現について。

正規表現によるマッチング(?)を勉強しています。

例えば「blog」という文字列で、マッチングを試みる場合は、
String str = "blog";
で、strに格納すると思うのですが、例えば「link rel=""」という文字列でマッチングを試みる場合はどうすればいいのでしょうか?
「""」の部分をそのまま文字列のダブルクォーテーションの中に入れると、エラーになってしまうので、何か別のやり方が必要だと思うのですが、わかりません…。

Aベストアンサー

もとい

”abc"abc”は”abc\"abc”と記述します

Q正規表現 ""で囲まれた内部は処理しない方法

正規表現でタグ内の項目内容に""をつける処理を考えています。

現在は、= の右側にある内容を""で囲む処理をしています。

C#で書いたコードは次ような感じです。
text = Regex.Replace(text, "(\\S)=([^\"' >]+)","$1=\"$2\"" ,RegexOptions.Singleline);

このときに次のようなHTMLコードがあった場合、

 <div id=000 class="tayp1,type2">
 <div id="111" class=type1>
 <img src="200.gif" alt="100+100=200">

すると次のような結果になります。

 <div id="000" class="tayp1,type2">
 <div id="111" class="type1">
 <img src="200.gif" alt="100+100="200"">

3行目はalt内にも=があるため間違った処理をしてしまいます。
誤:alt="100+100="200""

このような""内部は処理しないようにするにはどうすればよろしいでしょうか?
""内部の=にはヒットしななれば…と思っているのですが。

よろしくお願いします。

正規表現でタグ内の項目内容に""をつける処理を考えています。

現在は、= の右側にある内容を""で囲む処理をしています。

C#で書いたコードは次ような感じです。
text = Regex.Replace(text, "(\\S)=([^\"' >]+)","$1=\"$2\"" ,RegexOptions.Singleline);

このときに次のようなHTMLコードがあった場合、

 <div id=000 class="tayp1,type2">
 <div id="111" class=type1>
 <img src="200.gif" alt="100+100=200">

すると次のような結果になります。

 <div id="000" class="tayp1,type2">
 <div id="111...続きを読む

Aベストアンサー

#1,#2です。お書きの部分が、[^\"' >]+ となっていたので、空白は除外かと思っていました。
最初から"で囲まれていた場合は、先にマッチさせて元と同じ物に置換すれば良いですね。

text = Regex.Replace(text, "(\\s\\w+)=\"([^\"]*)\"|(\\s\\w+)=([^\"' >]+)","$1$3=\"$2$4\"" ,RegexOptions.Singleline);

かな。
' で囲まれた物も対象にしたければ同じ調子で。

Qperlを用いた特定文字列間の抽出方法について 下記のテキストファイル、test1.logからst

perlを用いた特定文字列間の抽出方法について

下記のテキストファイル、test1.logからstart〜end間を抽出するpealを作ろうと思っています。

$datafile="test1.log";
open(FH, $datafile);

@list = <FH>;

while (<FH>) {
'print if /^start$/ .. /^end$/';
}

ですが、実行してもエラーにはなりませんが何も出力されません。
どこに問題があるのかが分かりません。
最終的にはカレントディレクトリにある複数のtest1.logと同様の.logファイルを
一括で処理したいと思っています。

test1.logファイルの内容
start
aaa
bbb
ccc
end
eee
fff
ggg

分かる方がいらっしゃいましたら、お知恵をお借りしたくよろしくお願いいたします。

Aベストアンサー

> @list = <FH>; # ファイルポインタがファイルの末尾に移動

> while (<FH>) { # ポインタがファイルの末尾なのでループを実行せずに終了
>  print if /^start$/ .. /^end$/;
> }

ファイルの読み取りは1度だけですので、再オープンするか、読み取った @list を利用するなどが必要です。

(1) ファイルの再オープン
@list = <FH>;
open FH, $datafile or die;
while (<FH>) {

(2) @list の利用
@list = <FH>;
while ($_ = shift @list) {

(3) @list の作成を止める
# @list = <FH>;
while (<FH>) {

QPerlで特定行から特定行までを抜き出したい

皆さんのお知恵をお貸し頂ければ幸いです。

Perlで以下のようなことをしたいと考えています。
例えば、次のようなテキストファイルがあったとします。

example.log
==================================
aaaa
hogehoge
test
okok
perl
script
==================================

上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。
イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

このような場合、どういう風にすればいいのでしょうか?
恐れ入りますが、ご教授頂ければ幸いです。

それでは、どうぞよろしくお願い致します。

Aベストアンサー

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $flag = 0 }
  elsif ($flag) { print "$data\n" }
}
close FH;

で、もっと略したいPerlな人だとこんな感じ。Perl独特の記法がふんだんに使われているので、勉強するには不向きかもしれませんが^^;

open FH, "example.log" or die $!;
while (<FH>) {
  print if /^hogehoge$/ .. /^perl$/ and !/^(?:hogehoge|perl)$/;
}
close FH;

※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $fl...続きを読む

Q複数ファイルの読み込みについて

perl初心者です。

あるディレクトリから拡張子がdataであるファイルを全て読み込みたいのですが、方法がわかりません。
cshで書くと
foreach arg (*.data)
コマンド $arg

のようになりますが、perlだと
foreach $arg (@arg){
コマンド $arg

となりますよね?
引数がリストなのでよくわかりません。
そもそもperlではできないのでしょうか?


それともう一点ですが、ファイルオープンするときに
foreachループの中で
open(FILE, "$arg");
とすることは可能ですか?
上の質問と組み合わせて全てのファイルを開いて作業を行いたいので。

説明が下手ですいません。補足しますのでよろしくお願いします。

Aベストアンサー

while(<*.data>)
{
## $_には、*.DATAなファイル名が格納されている。
open(F,"$_"); ##openする。
while(<F>)
{
##読み出された内容が$_に格納されている。
print $_; ##出力してみる。
}
}

というのが最短コーディングです。

Qダブルクォーテーションの削除(置換)

$a = qq/"aaaaaa","bbbbb"/;
print $a;
→ "aaaaa","bbbbb"

としたときの、変数 $a の中にある
ダブルクォーテーションを削除したいのですが、

$a =~ s/"//;
では何も変化が無くて、

$a =~ tr/"/ /;
では半角スペースに置換できるのですが、

$a =~ tr/"//;
では何も変化がありません。

上手く出来る方法はどの様な方法でしょうか?
教えていただければありがたいです。

よろしくお願いいたします。

Aベストアンサー

$a =~ s/"//;
とした時には
→aaaaa","bbbbb"
という風に一つ目の「"」だけは無くなっていませんか?
$a =~ s/"//g;
とすれば全ての「"」を削除できます。

また、tr///を使う時には、
$a =~ tr/"//d;
とすれば変換先リストに無い文字を削除できます・

参考URL:http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k08.htm

Q文字列の抽出

指定したファイルの中から'<'と'>'とで囲まれた部分文字列を抽出したいのですが方法がわかりません。どのようにしたらできるでしょうか?
*ファイルは制御コードが混じっているのでバイナリとして扱わないといけないかもしれません。
よろしくお願い致します。

-------------------------------------------------
open(IN, "test.dat");
open(OUT, "> out.txt");
binmode(IN);

while (<IN>) {
/^<(\w+)>$/;
print OUT "$1\n";
}

close(IN);
close(OUT);

Aベストアンサー

#3 です。 回答にsが抜けてました。
while (/<(.*?)>/g) ではなく, while (/<(.*?)>/gs)です。
ごめんなさい。


> ●対応する'<'と'>'で抽出し、ごみの'<'や'>'は無視する

これは<>がネストしてしまった場合等は一番内側の<~>内にしておくという解釈でよろしいでしょうか? 抽出したい<>の中に <や>は入らないということ前提ですが、 while部分を
while(/<([^<>]*)>/sg){
とするとどうでしょう sは複数行にまたがってマッチさせるためのオプションです。binmodeを使っている場合は不要なので /<([^<>]*)>/g でも大丈夫です。


●'<'と'>'の間に'@'がある場合のみ正規なものとする
でよいのなら,

while (/<([^<>]*?@[^<>]*?)>/sg)

とするとどうでしょう。sは上と同じ理由でbinmodeの場合は省いてもかまいません。

--------------
前者と後者でのテスト結果も一応残しておきます。
■ データ
<aa><bb>
<cccc>
<ddd

ddd>
eee<f
fff>
<gggg<hhhh>iiiii<jjj@jjjj>kkkk>
lllll<m<n@nn>ooo<p> >><<qqq@qq>rrr<s
@sss>ttt@uu<vv@vv>wwww>

■前者
aa
bb
cccc
ddd

ddd
f
fff
hhhh
jjj@jjjj
n@nn
p
qqq@qq
s
@sss
vv@vv

■後者
jjj@jjjj
n@nn
qqq@qq
s
@sss
vv@vv

#3 です。 回答にsが抜けてました。
while (/<(.*?)>/g) ではなく, while (/<(.*?)>/gs)です。
ごめんなさい。


> ●対応する'<'と'>'で抽出し、ごみの'<'や'>'は無視する

これは<>がネストしてしまった場合等は一番内側の<~>内にしておくという解釈でよろしいでしょうか? 抽出したい<>の中に <や>は入らないということ前提ですが、 while部分を
while(/<([^<>]*)>/sg){
とするとどうでしょう sは複数行にまたがってマッチさせるためのオプションです。binmodeを使っている場合は不要なので /<([^<>...続きを読む


人気Q&Aランキング