【问题标题】:Multiline string literal in Matlab?Matlab中的多行字符串文字?
【发布时间】:2013-01-09 11:09:13
【问题描述】:

Matlab 中是否有多行字符串字面量语法,还是需要连接多行?

我找到了verbatim 包,但它只适用于 m 文件或函数,不能在编辑器单元格中交互。

编辑:我特别喜欢在代码中修改文字的可读性和易用性(想象它包含不同级别的缩进块) - 制作多行字符串很容易,但我正在寻找最方便的语法来做到这一点.

目前为止

t = {...
'abc'...
'def'};
t = cellfun(@(x) [x sprintf('\n')],t,'Unif',false);
t = horzcat(t{:});

给出 size(t) = 1 8,但显然有点乱。

编辑 2:基本上 verbatim 做我想要的,除了它在编辑器单元格中不起作用,但也许我最好的选择是更新它。我认为应该可以从 java 界面获取当前打开的文件和光标位置到编辑器。问题是如果在同一个单元格中有多个逐字调用,您将如何区分它们。

【问题讨论】:

  • 我不确定我是否听懂了你的问题。你能添加一些例子来阐明你的目标吗?
  • Shai:我想在 Python 中输入像 """ 这样的多行字符串字面量:例如,从另一个来源复制并粘贴一段文本(保持缩进)到 matlab 字符串中。

标签: string matlab multiline literals


【解决方案1】:

我会去:

multiline = sprintf([ ... 
'Line 1\n'... 
'Line 2\n'... 
]);

【讨论】:

  • 我猜它用单元格数组来代替手动添加换行符,但想法几乎相同......都让复制和粘贴文字块有点痛苦!
  • 获取一个可以使用正则表达式进行搜索/替换的编辑器,然后将 \n 替换为 \\n\'...\n\'
  • 您可以使用undocumentedmatlab.com/blog/… 以编程方式将您的文本特殊粘贴到编辑器中,进行必要的替换。s
  • 使用sprintf 获取格式化的多行字符串。 fprintf 应该用于直接打印到屏幕上。
  • @sequielo:编辑以反映这一点
【解决方案2】:

Matlab 很奇怪,因为字符串中的转义处理是 printf 系列函数的函数,而不是字符串文字语法。并且没有多行文字。哦,好吧。

我最终做了两件事。首先,使CR()LF() 函数分别只返回已处理的\r 和\n,这样您就可以在代码中将它们用作伪文字。我更喜欢这样做,而不是通过 sprintf() 发送整个字符串,因为其中可能有其他反斜杠,您不希望将其作为转义序列处理(例如,如果您的某些字符串来自函数参数或从其他地方读取的输入)。

function out = CR()
out = char(13); % # sprintf('\r')

function out = LF()
out = char(10); % # sprintf('\n');

其次,创建一个 join(glue, strs) 函数,该函数的工作方式类似于 Perl 的 join 或示例中的 cellfun/horzcat 代码,但没有最后的尾随分隔符。

function out = join(glue, strs)
strs = strs(:)';
strs(2,:) = {glue};
strs = strs(:)';
strs(end) = [];
out = cat(2, strs{:});

然后像你一样将它与单元格文字一起使用。

str = join(LF, {
    'abc'
    'defghi'
    'jklm'
    });

您不需要像这样在单元格文字中使用“...”省略号;省略它们会进行垂直向量构造,如果行具有不同长度的 char 字符串,那很好,因为它们每个都卡在一个单元格内。仅此一项就可以为您节省一些打字时间。

【讨论】:

  • 我正在使用 Matlab r2007b 和 cat(1, strs{:});未按预期处理,我得到“CAT 参数尺寸不一致。”。这可能是由于我的旧 Matlab 版本造成的吗?
  • 好吧,对我来说,使用函数调用 char(1, strs{:});相反,似乎有效。
  • @RobertG:你说得对——应该是cat(2, strs{:})horzcat(strs{:})。愚蠢的监督;对不起。固定的。调用char(1, strs{:}) 可能会生成一个填充的二维字符数组,而不是一个带有嵌入换行符的长字符向量,这可能也很有用,但不是我想要join() 的目的。 (如果您的所有输入字符串的长度都与 OP 相同,cat(1,...) 似乎可以工作,但输出格式错误。)
【解决方案3】:

有点旧线程,但我明白了

multiline = join([
"Line 1"
"Line 2"
], newline)

我认为如果让事情变得很容易,但显然这取决于人们在寻找什么:)

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 2012-03-11
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    相关资源
    最近更新 更多