简单的正则表达式不适用于Perl

时间:2013-12-05 18:11:25

标签: regex perl

我有一个简单的Perl正则表达式,它应匹配两个字符之间的空格,并用*替换空格。在某些情况下,它根本不起作用。 Perl这一行是这样的:

s/([A-Za-z0-9])\s+([A-Za-z0-9])/\1 * \2/g;

例如见下文:( ~>是我的zsh提示符)

~> cat mwe
s t Subscript[r, 1]
~> perl -pe "s/([A-Za-z0-9])\s+([A-Za-z0-9])/\1 * \2/g;" < mwe
s * t Subscript[r, 1]

t Subscript[r, 1]未匹配。这只是一个例子。我的文件更长,虽然正则表达式捕获最正确,但我找不到它不匹配(并且应该)的模式。

Vim似乎正确地找到了所有内容(在适当的正则表达式语法更改之后)。

我该如何解决这个问题?我该如何帮助诊断问题?

谢谢。

1 个答案:

答案 0 :(得分:3)

改为使用lookahead:

perl -pe 's/([a-z0-9])\s+(?=[a-z0-9])/\1 * /ig' mwe

<强>输出:

  

s-E ^(t *下标[r,1])t * v-E ^(t *下标[r,1])y-E ^(t *   下标[r,1])t * y + E ^ t * s *下标[r,1] +2 * E ^(t *   下标[r,1])s *下标[r,1] -3 * E ^(t + t *下标[r,1])s *   下标[r,1] + E ^(t *下标[r,1])s * t *下标[r,1]

问题在于你的正则表达式是匹配而不是向前看。因此,对于以下情况:

perl -pe 's/([a-z0-9])\s+([a-z0-9])/\1 * \2/ig' <<< "a b c"

你会得到:

a * b c

由于b之前已匹配且内部指针已向前移动。