【发布时间】:2016-02-08 01:11:59
【问题描述】:
我想出了这个正则表达式
[0-9]+:"https:\/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/
与此数据匹配
...
21:"https://10.0.0.0/blah"
...
而我最终想要的是
...
4:"blah"
...
减去的金额是 https:// 部分的长度。要减去的数字是恒定的,即 IP 地址总是相同的,所以我正在寻找某种替代,比如这个伪正则表达式
s|[0-9]+:"https:\/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/|($1-17):"|g
其中 17 是长度,但我无法想出可以执行此操作的方法。我想我需要一种神奇的 perl one 衬里。这些数据也都在 MySQL 数据库中,所以我可以在 SQL 中做一些正确的事情,但对分组选项以及是否可以在 SQL 中进行算术运算不够熟悉。
我也明白正则表达式不能做算术(SO 上的那个神奇的除外)
也许 AWK 最适合这个?我以前从未使用过 AWK,所以需要阅读一下
【问题讨论】:
-
在 Perl 中,替换表达式可以是 Perl 代码:
s{...}{ ($1-21).':"' }e(其他语言也有类似的功能。) -
你能解释一下为什么 42 变成 15 吗?
-
@ThisSuitIsBlackNot,他想减去 21,从他解决这个问题的尝试中可以看出。 ...等等,这会将 42 变成 21,而不是 15?!
-
@ikegami 42 - 21 = 21。编辑:你抓住了它。
-
比较简单的方法是反序列化数据、修改值、序列化数据和更新行。这不是一个选择吗?