痔になりやすい生活習慣とは?

perl で 文字列を split で処理する時に、" や ' で挟まれた領域を一つの文字列として処理するにはどうやったらよいのでしょうか?
たとえば
$aaa = "aaa bbb 'c d e' fff";
@aaa = split(/ /, $aaa);
だと、
aaa
bbb
'c
d
e'
fff

となってしまいますが、
aaa
bbb
'c d e'
fff
となるようにするにはどうするのでしょうか?

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

A 回答 (4件)

一発で分割する正規表現は思い浮かびませんでした。



(ダブル)クオテーションで囲まれた部分にあるスペースを一旦、\0に置き換えてから
splitし、その後また元のスペースに戻すという方法を思いつきました。

$aaa = "aaa bbb 'c d e' fff";

$aaa =~ s/(['"].*?['"])/(my $s = $1) =~ tr| |\0|; $s/eg;
@aaa = split / /, $aaa;
@aaa = map { s/(['"].*?['"])/(my $s = $1) =~ tr|\0| |; $s/eg; $_ } @aaa;
    • good
    • 1
この回答へのお礼

ご回答ありがとうございました。

ここでの皆さまのご回答を参考にしてできるようになりました。

お礼日時:2009/10/28 10:58

一応無理すれば


@aaa = grep { defined $_ } split(/('.*?'|".*?")|\s+/, $aaa);
とかできるけど...
split だけではダメだと思う.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

質問が変でした。
split だけでは無理なので、どうやればよいか、と書くべきでした。
ここでの皆さまのご回答を参考にしてできるようになりました。

お礼日時:2009/10/28 10:58

ダブルクォーテーションが抜けてた


my $str = q(aaa bbb 'c d e' fff '' a b c 'X' 'Y' "AAA BBB" aiueo);
print "$str\n";
my @items = ( $str =~ /(?:"[^"]*")|(?:'[^']*')|(?:[^ ]+)/g );
for my $item (@items) {
print "$item\n";
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

質問が変でした。
split だけでは無理なので、どうやればよいか、と書くべきでした。
ここでの皆さまのご回答を参考にしてできるようになりました。

お礼日時:2009/10/28 10:57

split じゃ、たぶん無理です


my $str = "aaa bbb 'c d e' fff '' a b c 'X' aiueo";
my @items = ( $str =~ /(?:'[^']*')|(?:[^ ]+)/g );
for my $item (@items) {
print "$item\n";
}

この回答への補足

質問が変でした。
split だけでは無理なので、どうやればよいか、と書くべきでした。
ここでの皆さまのご回答を参考にしてできるようになりました。

補足日時:2009/10/28 10:53
    • good
    • 0

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

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

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

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

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

Qperlでcsvファイルを読む(ダブルコーテーション内カンマを無視したい)

perlでCSVファイルを読み込むスクリプトを作っています。

以下のようなCSVファイルがあります。

■CSVファイル
東京,よろしくお願いします。
大阪,はじめまして
九州,"5,000円でお願いします"

カンマで区切り、以下のようにすると、"5,000円"の部分が2つに分かれてしまいます。
($data1,$data2) = split(/,/,$all_data)

前後にダブルコーテーションがあった場合、中のカンマで区切らないような良い方法はないでしょうか?

環境:
Perl 5.8.5

Aベストアンサー

Text::ParseWords を使ってこんなのはどうですか。(例ではparse_lineを使っています)
もしquoteを残したければundefを1に変えてください。

use Text::ParseWords;

$" = "\t";
while (<DATA>) {
chomp;
my @words = &parse_line(',', undef, $_);
print "@words\n";
}

exit 0;
__DATA__
東京,よろしくお願いします。
大阪,はじめまして
九州,"5,000円でお願いします"

Q文字列の ' aaa"bbbccc"ddd' から"で囲まれた部分を抜き出したい

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

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

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


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

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

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

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

Aベストアンサー

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

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

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

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

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

Aベストアンサー

([^\"])

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

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

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

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

Aベストアンサー

もとい

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

QCSVファイルの中で、「 , 」カンマを使いたい

「 , 」で区切られたCSVファイルの中で、「 , 」カンマを使いたいのですが、可能でしょうか?

具体的には「これは1,500円でした。」というように、CSVファイルに収められた文章内で出てくる半角の数字(お金)の区切りに使いたいのです。
全角では代用したくないのですが、CSVファイルでデータを受け渡しする際に、困っています。

例えば、特殊文字などで対応可能でしょうか?

Aベストアンサー

受け渡しに使うと言うことは相手方のアプリケーションのことも考えなければいけないのですが・・・とりあえず対応が簡単そうな方法を。

1.各セルを""で囲む。(もちろんデータにダブルクォートがある場合はカンマと同様に困ります。
2.カンマで区切らずにタブで区切る。(比較的使われない文字ですが、やはりデータ中にタブがあるとカンマと同様です)

難しいけれど完璧に対応するためには、データ中の区切り文字は特殊な文字列に変更し、受け取り側のアプリケーションではその特殊な文字列をデータ中の区切り文字として扱うという方法が使われます。
例えば、データ中のカンマは\,にするとか。

データ作成側、受け取り側でそれぞれどこまで対応できるのか分かるともっと簡単かつ具体的な方法を回答できるかも知れません。

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数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

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カンマ区切りのCSVファイルから""を削除したい

初めて質問いたします

以下のような形式のCSVファイルがあります
例)
品名,数量,単価,金額
"りんご",1,150,150
"バナナ",10,200,2000
"メロン","1,000","2,000","2,000,000"

上記のように、品名にはダブルクォーテションがつき、
数量、単価、金額については桁区切りのカンマが発生する場合、ダブルクォーテーションで囲まれています

上記のようなデータを
りんご,1,150,150
バナナ,10,200,2000
メロン,1000,2000,2000000
のように別ファイルへ出力するにはどのようにすればよいでしょうか?

プログラムでの処理で、WSHを使ったものを教えていただけますと、幸いです
よろしくお願いいたします

Aベストアンサー

もう仕事は終わってしまったかもしれませんが、(^^ゞ
VBS で作ってみました。
対象CSVファイルのあるフォルダに保存して実行してみてください。
_NewFilesフォルダに保存されます。
※対象外のCSVファイルが有っても処理してしまいます

Dim oSh
Dim oFs
Dim BaseFolder
Dim newFolder
Dim f

Set oSh = CreateObject("Wscript.Shell")
Set oFs = CreateObject("Scripting.FilesystemObject")
Set BaseFolder = oFs.getFolder(oSh.currentDirectory)

newFolder = BaseFolder.Path & "\" & "_NewFiles"

If oFs.folderExists(newFolder) = False Then
oFs.createFolder (newFolder)
End If

For Each f In BaseFolder.Files
If oFs.GetExtensionName(f) = "csv" Then
Call changeIt(f.Path, newFolder)
End If
Next

MsgBox newFolder & " フォルダ内を検証"


Sub changeIt(orgFname, trgFolder)
Dim oFs
Dim orgF
Dim newF
Dim newFname
Dim buF
Dim oReg

Dim Mcol
Dim M
Dim M1, M2
Const forReading = 1
Const forWriting = 2

Set oFs = CreateObject("Scripting.fileSystemObject")
Set oReg = CreateObject("VBScript.RegExp")
Set orgF = oFs.getFile(orgFname).openAsTextStream(forReading)

newFname = trgFolder & "\" & oFs.getBaseName(orgFname) & "_New.csv"
oFs.CreateTextFile (newFname)
Set newF = oFs.getFile(newFname).openAsTextStream(forWriting)

With oReg
.Pattern = """.*?"""
.IgnoreCase = False
.Global = True
End With

Do Until orgF.atendofstream
buF = orgF.readline
Set Mcol = oReg.Execute(buF)

For Each M In Mcol
M1 = Replace(M.Value, ",", "")
buF = Replace(buF, M.Value, M1)
M2 = Replace(M1, Chr(34), "")
buF = Replace(buF, M1, M2)
Next

newF.WriteLine buF
Loop

orgF.Close: newF.Close
Set Mcol = Nothing
Set oReg = Nothing

End Sub

もう仕事は終わってしまったかもしれませんが、(^^ゞ
VBS で作ってみました。
対象CSVファイルのあるフォルダに保存して実行してみてください。
_NewFilesフォルダに保存されます。
※対象外のCSVファイルが有っても処理してしまいます

Dim oSh
Dim oFs
Dim BaseFolder
Dim newFolder
Dim f

Set oSh = CreateObject("Wscript.Shell")
Set oFs = CreateObject("Scripting.FilesystemObject")
Set BaseFolder = oFs.getFolder(oSh.currentDirectory)

newFolder = Bas...続きを読む

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング