【问题标题】:Replace every non letter or number character in a string with another用另一个替换字符串中的每个非字母或数字字符
【发布时间】:2022-07-07 16:48:38
【问题描述】:

上下文

我正在设计一个运行大量计算并输出数字的代码。在代码的最后,我想以一种很好的方式保存所有内容,所以我的做法是转到用户指定的输出目录,创建一个新文件夹,然后运行保存过程。

问题

我的问题有两个:

  1. 我希望我的文件夹名称是唯一的。我正在考虑获取当前日期和时间,并从中创建一个唯一的名称和输入文件名。这有效,但它生成的文件夹名称有点神秘。是否有一些我没有听说过的良好做法/惯例可以做到这一点?

  2. 当我得到 datetime 字符串 (tn = datestr(now);) 时,它看起来像这样:

tn =

'07-Jul-2022 09:28:54'

为了将其转换为一个好的文件名,我将'-'' '':' 字符替换为下划线,并将其附加到用户选择的输入文件名的较短版本中。我使用strrep

tn = strrep(tn,'-','_');
tn = strrep(tn,' ','_');
tn = strrep(tn,':','_');

这很好,但它让我不得不使用 3 行代码来做到这一点。有一个不错的班轮可以做到这一点吗?更一般地说,有没有办法查找字符串中的每个非字母或数字字符并将其替换为给定字符?我敢打赌这就是 regexp 的用途,但坦率地说,我无法完全掌握正则表达式的工作原理。

【问题讨论】:

    标签: matlab directory


    【解决方案1】:

    您的观点 (1) 是基于意见的,因此您可能会得到各种答案,但我认为一个常见的约定是至少以相反顺序的日期字符串开始名称,以便按字母顺序排序与按时间顺序排序相同(即yymmddHHMMSS)。

    要直接回答您的主要问题,您可以使用内置的makeValidName utility,它是为生成有效的变量名而设计的,但也适用于生成类似的“普通”文件名

    str = '07-Jul-2022 09:28:54';
    str = matlab.lang.makeValidName(str)
    % str = 'x07_Jul_202209_28_54'
    

    因为有效的变量不能以数字开头,所以它会以 x 为前缀 - 您可以通过先手动添加更具描述性的前缀来避免这种情况。

    要使用不同的方法间接回答,datestr 的一个很好的技巧是使用以下语法解决此问题并一次性解决第 (1) 点:

    str = datestr( now(), 30 );
    % str = '20220707T094214'
    

    30 输入(来自 docs)为您提供一个 ISO 标准化字符串,倒序到最接近的秒数:

    'yyyymmddTHHMMSS' (ISO 8601)

    (请注意,中间的 T 不是某个时间测量的占位符,它仍然是一个文字字母 T 来分割日期和时间部分)。

    【讨论】:

      【解决方案2】:

      我通常使用带前缀的文件夹命名方法。所以,类似folder_name = ['results_' strrep(datestr(now), ':', '.')]

      关于第二个问题,folder_name(~isstrprop(folder_name, 'alphanum')) = '_'怎么样?

      【讨论】:

        猜你喜欢
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 1970-01-01
        • 2013-12-03
        • 2019-05-14
        • 2020-03-30
        • 2012-09-04
        相关资源
        最近更新 更多