【问题标题】:Why is my regexp matching multiple times?为什么我的正则表达式匹配多次?
【发布时间】:2013-09-03 21:01:46
【问题描述】:

我有以下行,我想通过正则表达式捕获几个字符串:

l = '15                 1180       62444    e0e0                   049c     f3ec      104';

我正在扩充以下正则表达式以在此行上进行操作:

d = regexpi(l, '([0-9a-f]+)\s?', 'tokens');

当执行这一行时,我得到了length(d) == 7。正则表达式不应该只匹配第一次出现,即length(d) == 1d{1} == '15'

对于它的价值,我在 Perl 中使用了相同的正则表达式,发现它只匹配模式的第一个实例(这是我所期望的):

my $l = ... #defined above already
$l =~ m/([0-9a-f]+)\s?/i;

if (! defined($2)){ # $2, $3, ..., $n will be defined for n matches
    print "Didn't match twice!\n"; # this prints when I execute the script
}

【问题讨论】:

  • 你到底想匹配/捕获什么?
  • @hwnd - 我想让每个十六进制/十进制值类似于 OP 中的第一行。我的问题主要是试图理解为什么 MATLAB 中的正则表达式行为与 Perl 等其他正则表达式解析器不同。我拥有的单行 MATLAB 命令完美运行,但我没想到。
  • regexpi 的帮助文本说:默认情况下,regexpi 返回所有匹配项。要仅查找第一个匹配项,请使用 regexpi(STRING,EXPRESSION,'once')
  • ayyy,我应该知道要更仔细地查看帮助 :) 我最初在使用 MATLAB 之前用 Perl 编写了我的脚本,并错误地认为正则表达式在两种语言中的处理方式相同。

标签: regex matlab


【解决方案1】:

正如使用regexpi...

start = regexpi(str,expr) 返回一个行向量 start,其中包含 str 中匹配正则表达式字符串 expr 的子字符串的索引,无论大小写。

当 str 或 expr 是字符串元胞数组时,regexpi 返回索引行向量的 m×n 元胞数组,其中 m 是 str 中的字符串数,n 是正则表达式模式的数量在表达式中。

[start,finish] = regexpi(str,expr) 返回一个额外的行向量完成,其中包含 start 中相应子字符串的最后一个字符的索引。

[start,finish,tokens] = regexpi(str,expr) 返回一个 1×n 元胞数组 tokens,它包含 start 和 finish 中相应子字符串内的标记的开始和结束索引。记号在表达式 expr 中用括号表示。

[...] = regexpi(str,expr,'once') 只找到第一个匹配项。 (默认情况下,正则表达式返回所有匹配项。)如果没有找到匹配项,则所有返回值为空。

【讨论】:

    【解决方案2】:

    根据MatLab's regexpi page,您应该寻找的第一页regexpi

    返回与正则表达式指定的字符模式匹配的每个子字符串的起始点。

    你得到一个起始位置数组,第一个元素 d{1} 将是第一个匹配的偏移量,而不是它的“值”。

    【讨论】:

    • d[0] 不是有效的 Matlab 代码,因为它是一种单基语言。
    • 对了。我对 OP 的 d{1}=15 感到困惑;这不是一个偏移,而是一个想要的result
    猜你喜欢
    • 2022-11-22
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2022-01-04
    • 2020-04-27
    相关资源
    最近更新 更多