1

我有一个“3 x 1”单元格数组,其内容如下所示:

'ASDF_LE_NEWYORK Fixedafdfgd_ML'
'Majo_LE_WASHINGTON FixedMonuts_ML'
'Array_LE_dfgrt_fdhyuj_BERLIN Potato Price'

我希望能够优雅地提取并创建另一个 '3x1' 单元格数组,其内容为:

'NEWYORK'
'WASHINGTON'
'BERLIN'

如果您注意到上面的名称位于最后一个下划线之后和第一个 SPACE 或“_ML”之前。我如何以简洁的方式编写这样的代码。

谢谢

编辑:

对不起,伙计们,我应该用一个更好的例子。我现在已经纠正了。

4

2 回答 2

2

您可以使用lookbehind for_和lookahead for 空间:

names = regexp(A, '(?<=_)[^\s_]*(?=\s)', 'match', 'once');

A包含字符串的元胞数组在哪里:

A = {...
'ASDF_LE_NEWYORK Fixedafdfgd_ML'
'Majo_LE_WASHINGTON FixedMonuts_ML'
'Array_LE_dfgrt_fdhyuj_BERLIN Potato Price'};

>> names = regexp(A, '(?<=_)[^\s_]*(?=\s)', 'match', 'once')
names = 
    'NEWYORK'
    'WASHINGTON'
    'BERLIN'
于 2013-09-24T06:57:30.903 回答
1

注意:问题已更改,因此答案不再完整,但希望该regexp示例仍然有用。

试试regexp这样:

names = regexp(fullNamesCell,'_(NAME\d?)\s','tokens');
names = cellfun(@(x)(x{1}),names)

在 pattern_(NAME\d?)\s中,括号定义了一个子表达式,它将作为标记(匹配文本的一部分)返回。\d?指定零位或一位数,但您可以只使用一位数,\d{1}或者\d{1,3}如果您期望在 1 到 3 位之间。指定的\s空格。

的重组names有点复杂,但是当您将正则表达式与单元格输入一起使用时,tokens您会得到一个单元格,需要为您的目的进行一些重新格式化。

于 2013-09-23T23:09:24.847 回答