Perl正则表达式:替换URL的可选部分

时间:2017-12-31 00:48:30

标签: regex perl

我有一个包含HTTP /数据库URL的属性文件,如下所示:

http://localhost:8888/some_user?holiday=true
jdbc:hsqldb:hsql://localhost:9999/another_user?holiday=true&paid=true
jdbc:mysql://localhost:8888/some_user
http://localhost/some_user

每个网址都显示在单独的一行中。

每一行都可以以空格(空格/制表符),\n或任何内容结尾(如果它是最后一行)。

行之间的差异:

  • 网址可以是网址,也可以是某个数据库网址
  • 可能有也可能没有端口号,
  • 可能有也可能没有可选参数,
  • 用户名

我想用XXXX替换端口号(如果存在)和用户名。

例如,之前的网址应为:

http://localhost:XXXX/XXXX?holiday=true
jdbc:hsqldb:hsql://localhost:XXXX/XXXX?holiday=true&paid=true
jdbc:mysql://localhost:XXXX/XXXX
http://localhost/XXXX

以下是我所做的:

我将其分解为两个正则表达式...如果我想使用环顾四周,我将不得不这样做:

  • 替换端口号(如果存在):

    perl -i -0777 -pe 's/(?<=localhost:)\d+/XXXX/g' file;

  • 然后,替换用户名:

    perl -i -0777 -pe 's/(?<=localhost\/)(?<=localhost:XXXX\/)[\S&[^?]]*(?=[?\s\Z]?)/XXXX/g' file;

第二个正则表达式没有替换用户名......任何想法有什么问题?

此外,还有一种简单的方法可以考虑最后一行的情况,它可能不会以换行符等空格结尾。

2 个答案:

答案 0 :(得分:3)

为什么要打扰正则表达式? URI模块可以为您完成所有操作:

{{1}}

答案 1 :(得分:2)

鉴于URL解析的复杂性,最好使用URI模块。

这是一个两遍正则表达式。第一个正则表达式匹配第一个/:(在协议标识符之后),后跟:和数字; \K使它删除所有先前的匹配,因此只替换端口。第二个正则表达式替换了第一个?之后的所有连续非/

perl -ple'
    s{^ [^:]* :// [^/:]* : \K \d+ }{XXXX}x;
    s{^ [^:]* :// [^/]* \K [^?]* }{/XXXX}x;
' input > output

没有必要运行两个单行,因为这严格按行进行。更正了ikegami的代码。

更新问题更新

正确处理多个协议,并将正则表达式的更改开始为

s{^ .*? ://  ...

以匹配第一个://的内容,包括第一个CREATE TABLE Ages (name VARCHAR(128),age INTEGER)` DELETE FROM Ages; INSERT INTO Ages (name,age) Values ('Alex',25); INSERT INTO Ages (name,age) Values ('Mel',31); INSERT INTO Ages (name,age) Values ('Fred',30); INSERT INTO Ages (name,age) Values ('Nancy',35); INSERT INTO Ages (name,age) Values ('Nathan',13); INSERT INTO Ages (name,age) Values ('Oscar',24); SELECT hex (name||age) AS X FROM Ages ORDER BY X SELECT * FROM X LIMIT 1 UPDATE X SET name = '53656C696E613333' 。其余的都一样。