我在带有 Python 脚本插件的 Notepad++ 中使用以下代码来匹配和增加 106 到 255 之间的数字,并以两边的空格分隔:
import re
import random
def calculate(match):
return '%s' % (str(int(match.group(1)) + 4))
editor.rereplace('((?<= )1[0-1][6-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5](?= ))', calculate)
但是如果我想包含大于 255 的数字怎么办?例如,我想包含最多 637 而不是 255。我该怎么做?如果不使用 RegEx,也许还有其他方法可以做到这一点?
答案1
首先,这些(?<= )
和(?= )
前瞻应该是外部组(numbers)
内,而不是组内。例如,现在,初始“空格前”(?<= )
运算符仅适用于 1[0-1][6-9] – 它不适用于所有其他以 | 分隔的替代项!即使没有空格分隔,您的正则表达式实际上也会匹配“abcdef200”。
(并且由于“1[0-9][0-9]”部分,它还匹配从 100 开始的值,而不是从 106 开始的值。)
因此你应该使用:
editor.rereplace('(?<= )(1[0-1][6-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?= )',
calculate)
中间的主要正则表达式很长,但实际上并不复杂——它只是一个|
以 - 分隔的选项列表,列举了数字可能出现的所有方式。
例如,如果要匹配数字 106 至 637,则可以按如下方式对它们进行分组(最后一位数字、最后 2 位数字、所有 3 位数字,然后以相同方式返回):
- 106至109:
10[6-9]
- 110 至 199(实际上是 11_ 至 19_):
1[1-9][0-9]
- 200 至 599(实际上是 2__ 至 5__):
[2-5][0-9][0-9]
- 600 至 629(实际上是 60_ 至 62_):
6[0-2][0-9]
- 630 至 637:
63[0-7]
所以最终的正则表达式将是这样的:
(?<= )(10[6-9]|1[1-9][0-9]|[2-5][0-9][0-9]|6[0-2][0-9]|63[0-7])(?= )
然而,你有Python。您不需要将所有逻辑都塞进正则表达式中——您可以先匹配所有数字,然后让 Python 回调决定每个结果的替换:
def calculate(match):
number = int(match.group(1))
if 106 <= number <= 637:
return str(number + 4)
else:
return str(number)
editor.rereplace('(?<= )([0-9]{3})(?= )', calculate)
匹配[0-9]{3}
所有 3 位数字(作为一点预防措施),并将它们替换为其自身或增加的值。