extractAft​erの記事に書かれて​あるプログラムを実行​した際になぜ実行結果​のようになるかが分か​りません。

3 ビュー (過去 30 日間)
裕也 福田
裕也 福田 2021 年 10 月 11 日
コメント済み: 裕也 福田 2021 年 10 月 11 日
str = ["C:\Temp\MyReport.docx";
"C:\Data\Experiment1\Trial1\Sample1.csv";
"C:\Temp\Slides.pptx"]
level = wildcardPattern + "\"
pat = asManyOfPattern(level) // この部分で出力が1×1になっていますが、wildcardPatternの記事を踏まえると、添付画像の右下のように、\で区切られたリストになっていると予測しました。
filenames = extractAfter(str,pat) // 左のコードの説明書きを読むとpatが最初に出てきたところから最後までを抽出するとなっていました。ですので、添付画像のようにTemp\がついたままになるのではないかと予測していました。
// 以上、コメントで示した2か所の実行結果に疑問があるので、なぜこの実行結果になるのかを解説していただけたら幸いです。何卒よろしくお願いいたします。

採用された回答

Atsushi Ueno
Atsushi Ueno 2021 年 10 月 11 日
extractAfter(str,pat) :pat が str 内で複数回出現する場合、newStr は pat の最初の出現から str の最後までです。
確認してみたところ、下記の通りで上記の説明通りです。
str = "The quick brown fox";
newStr = extractAfter(str,"quick ") % pat が str 内で1回出現する場合
newStr = "brown fox"
str = "The quick brown fox The quick brown fox";
newStr = extractAfter(str,"quick ") % pat が str 内で2回出現する場合
newStr = "brown fox The quick brown fox"
ここから本題です。
str = "C:\Temp\MyReport.docx";
pat = asManyOfPattern(wildcardPattern + "\");
path = extract(str,pat) % なぜ14x1 string arrayになるかは謎です。extractの仕様理解不足です
path = 14×1 string array
"C:\Temp\" "" "" "" "" "" "" "" "" "" "" "" "" ""
filenames = extractAfter(str,pat)
filenames = "MyReport.docx"
>左のコードの説明書きを読むとpatが最初に出てきたところから最後までを抽出するとなっていました。ですので、添付画像のようにTemp\がついたままになるのではないかと予測していました。
asManyOfPattern(wildcardPattern + "\")は「最長一致(最短一致+"\")」なので"C:\Temp\"にマッチします。従って、extractAfter(str,pat)に対してpat が str 内で"C:\”"Temp\"の2回ではなく、"C:\Temp\"の1回しか出現していません。だから"C:\Temp\"の後の”MyReport.docx”しか出力されません。
マッチ文字列の出力方法が良く分かっていなくてすいません
  1 件のコメント
裕也 福田
裕也 福田 2021 年 10 月 11 日
ありがとうございます。asManyOfPattern()は最長一致で、wildcardPatternは最短一致ということなんですね!少し勘違いしていました。extractの出力結果よくわかりませんよね…
最後の出力結果については、すっきりしたのでこれでやってることが捗ります。ありがとうございました!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeLanguage Support についてさらに検索

タグ

製品


リリース

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!