No.5ベストアンサー
- 回答日時:
> splitの中で、(?<=[A-Z])(?=\d)|(?<=\d)(?=[A-Z]) は何をしているのでしょうか?
この正規表現によって、位置を指定しています。位置は、文字と文字の間にあると考えてください。
(?<=[A-Z]) は位置の前の文字がアルファベットの大文字であることを要求し、(?=\d) は位置の次の
文字が数字であることを要求します。また、選択肢の次の正規表現は逆に並んでいることを要求し
ます。結局は、アルファベットの大文字と数字が隣接している位置で文字列は分割されることにな
ります。
> あと、たとえば特殊記号が文字列の中に入っていた場合とかどうでしょうか?
> 11A4C555ED6GFS7~BN → 11 A 4 C 555 ED 6 GFS 7 ~BN
> 例えば、特殊文字(今は「~」)がアルファベットの直前に来ていて
> それはアルファベットと付けて格納。
特殊文字の数が少なければ [A-Z] を [A-Z~] のように、文字クラスの中に追加するのが簡単です。
また、[A-Z] を [^\d] に変更するやり方がありますが、数字列に . や - が含まれる場合は分割
されることになります。
No.4
- 回答日時:
#1です。
#3で補足の回答も含まれてますが一応。$str = '11A4C555D67B114B9423C'; # 解析対象
@arr = $str =~ m/(\d+\D+)/g; #2さんの方法がスマートだったので変更
#以下は確認用
foreach(@arr){
($decimal,$alpha) = m/(\d+)(.*)/; # 数値とそれ以降に分離
print $decimal.'::'.$alpha,"\n"
}
↓結果
11::A
4::C
555::D
67::B
114::B
9423::C
No.3
- 回答日時:
split 関数の正規表現に位置を表す空文字を指定するのも1方法かと思います。
@array = split /(?<=[A-Z])(?=\d)/, '11A4C555D67B114B9423C'; # 11A, 4C, 555D, 67B, 114B, 9423C
@array = split /(?<=[A-Z])(?=\d)|(?<=\d)(?=[A-Z])/, '11A4C555D67B114B9423C'; # 11, A, 4, C, 555, D, 67, B, 114, B, 9423, C
この回答への補足
回答ありがとうございました。
kumozさんのやり方でお伺いしたいのですが、
splitの中で、(?<=[A-Z])(?=\d)|(?<=\d)(?=[A-Z])
は何をしているのでしょうか?
詳しく教えていただけないでしょうか?
あと、たとえば特殊記号が文字列の中に入っていた場合とかどうでしょうか?
11A4C555ED6GFS7~BN → 11 A 4 C 555 ED 6 GFS 7 ~BN
例えば、特殊文字(今は「~」)がアルファベットの直前に来ていて
それはアルファベットと付けて格納。
何度も申し訳ございませんが、よろしくお願いいたします。
No.1
- 回答日時:
以下のサンプルが参考になれば幸いです。
(想定外のデータを処理すると無限ループになるのでこのままではやや危険。)
$str = '11A4C555D67B114B9423C'; #解析対象
while($str){ # ループ $strの内容が空になるまで。
$str =~ s/\d+\D+//; # 数字とそれに続く数字以外を''に置換
push @arr,$&; # マッチした部分を配列に格納
}
#以下は確認用
foreach(@arr){
print $_,"\n";
}
↓結果
11A
4C
555D
67B
114B
9423C
この回答への補足
早速の回答ありがとうございました。
うまくできました。
もうひとつ質問をしてもいいでしょうか?
分解した結果を、数字と英数字に再度分解するためにはどうすればいいでしょうか?
11A が 11とA に、
4C が 4とCに
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) 2つのテキストファイルを比べて文字列を特定する方法を教えて下さい 5 2022/05/01 15:22
- Visual Basic(VBA) VBA B列にある前から10文字のみ表示 3 2023/08/07 11:24
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Excel(エクセル) Excelの数式の質問です。 A列に「redhat 8.0, centOS 7.9, python 4 2023/05/12 19:38
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
nullと""、\\0とEOFの違いにつ...
-
プログラムによく出てくるst...
-
%dなどの違い
-
C++で入力した文字列から数字を...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
シリアル通信で0x00を送信した...
-
Perlでの文字列操作について
-
TCL言語で文字列検索方法を教え...
-
VB6.0でのバイナリデータの扱い...
-
C#でstringをポインタとして渡す
-
C言語の勉強しています。すみま...
-
VBA-DLLの引数受け渡しについて
-
アルファベットをカウント、
-
WSH(VBS)でJSONの文字列を読み...
-
16進数を2文字ずつ配列に格納し...
-
VBAのプログラムで、DIAG = 1# ...
-
char*を初期化したいのですが
-
関数から配列を返すには?
-
Integer変数をカラにしたいので...
-
C言語 配列の長さの上限
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
nullと""、\\0とEOFの違いにつ...
-
C++で入力した文字列から数字を...
-
%dなどの違い
-
C#でstringをポインタとして渡す
-
16進数を2文字ずつ配列に格納し...
-
TCL言語で文字列検索方法を教え...
-
プログラムによく出てくるst...
-
WSH(VBS)でJSONの文字列を読み...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
数字の入った配列をファイルへ...
-
構造体→文字列→構造体 をする方法
-
VB6.0でのバイナリデータの扱い...
-
char型配列の最大要素数
-
[C++]WCHARの1文字目しか表示で...
-
アルファベットをカウント、
-
C言語の勉強しています。すみま...
-
VBA-DLLの引数受け渡しについて
-
c#で他のアプリの文字入力フォ...
-
Shift_JIS(16進)を文字に変換す...
-
バイナリファイル中の日本語文...
おすすめ情報