我有一个简单的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似乎正确地找到了所有内容(在适当的正则表达式语法更改之后)。
我该如何解决这个问题?我该如何帮助诊断问题?
谢谢。
答案 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
之前已匹配且内部指针已向前移动。