仅使用 一 Perl 替换正则表达式语句( s///
),下面我们怎么写:
每个成功匹配只包含一串字母字符 A..Z
.我们需要将匹配字符串替换为匹配字符串中每个字符的字符索引(按字母顺序)的总和。
注意:对于 A,字符索引将为 1,对于 B,2 ... 和 Z 将为 26。
请看下面的例子:
success match: ABCDMNA
substitution result: 38
笔记:
1 + 2 + 3 + 4 + 13 + 14 + 1 = 38;
自从
A = 1, B = 2, C = 3, D = 4, M = 13, N = 14 and A = 1.
最佳答案
我想我会将此作为答案发布,尽管提出这个想法的功劳应该归功于 abiessu对于 his answer 中提出的想法.
perl -ple'1 while s/(\d*)([A-Z])/$1+ord($2)-64/e'
由于这显然是家庭作业和/或学术兴趣,我将在剧透标签中发布解释。
- 我们匹配一个可选号码
(\d*)
,后跟一个字母 ([A-Z])
.数字是运行总和,字母是我们需要添加到总和的内容。- 通过使用
/e
修饰符,我们可以做数学运算,将捕获的数字添加到 ord()
捕获的字母的值,减去 64。返回并插入总和而不是数字和字母。- 我们使用
while
循环冲洗并重复,直到所有字母都被替换,剩下的就是一个数字。我们使用 while 循环代替 /g
修饰符将匹配重置为字符串的开头。
关于regex - Perl替代模式匹配中的算术计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25675850/