我有一个简单的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下标[r,1]未匹配.这只是一个例子.我的文件更长,虽然正则表达式捕获最正确,但我找不到它不匹配(并且应该)的模式.
Vim似乎正确地找到了所有内容(在适当的正则表达式语法更改之后).
我怎样才能解决这个问题?我该如何帮助诊断问题?
谢谢.
解决方法
改为使用先行:
perl -pe 's/([a-z0-9])\s+(?=[a-z0-9])/\1 * /ig' mwe
输出:
s-E^(t * Subscript[r,1]) t * v-E^(t * Subscript[r,1]) y-E^(t *
Subscript[r,1]) t * y+E^t * s * Subscript[r,1]+2 * E^(t *
Subscript[r,1]) s * Subscript[r,1]-3 * E^(t+t * Subscript[r,1]) s *
Subscript[r,1]+E^(t * Subscript[r,1]) s * t * Subscript[r,1]
问题是,在你的正则表达式中你是匹配而不是向前看.因此,对于以下情况:
perl -pe 's/([a-z0-9])\s+([a-z0-9])/\1 * \2/ig' <<< "a b c"
你会得到:
a * b c
由于b先前已经匹配,内部指针已经向前移动.