用正则表达式转换会话IRC日志



所以这里我有来自BNC的IRC日志,格式为(其中[AA:BB:CC]不是实际时间,只是加载时间):

[AA:BB:CC] <Person1> [re:al:ts] BLAH BLAH BLAH
[AA:BB:CC] <Person2> [an:ot:he] BLAH BLAH BLAH
[AA:BB:CC] <Person3> [rr:ea:lt] BLAH BLAH BLAH
[AA:BB:CC] <Person4> [im:es:tp] BLAH BLAH BLAH

我想把它转换成:

[re:al:ts] <Person1> BLAH BLAH BLAH
[an:ot:he] <Person2> BLAH BLAH BLAH
[rr:ea:lt] <Person3> BLAH BLAH BLAH
[im:es:tp] <Person4> BLAH BLAH BLAH

这在技术上可行吗?我看到[AA:BB:CC]可以很容易地删除,但是我如何保留真实的时间戳并将它们移动到行开头而不删除"blah blah blah"或"s"?老实说,我不是很精通正则表达式…

谢谢:)枫

一个要解决的例子:

perl -pe 's/^[..:..:..](.*)([..:..:..]) (.*)/$2$1$3/' <<EOT
[AA:BB:CC] <Person1> [re:al:ts] BLAH BLAH BLAH
[AA:BB:CC] <Person2> [an:ot:he] BLAH BLAH BLAH
[AA:BB:CC] <Person3> [rr:ea:lt] BLAH BLAH BLAH
[AA:BB:CC] <Person4> [im:es:tp] BLAH BLAH BLAH
EOT
输出:

[re:al:ts] <Person1> BLAH BLAH BLAH
[an:ot:he] <Person2> BLAH BLAH BLAH
[rr:ea:lt] <Person3> BLAH BLAH BLAH
[im:es:tp] <Person4> BLAH BLAH BLAH

如果AA, BB, CC,…

是数字,那么在perl regex中使用dd而不是..

如果您不使用多行匹配,请尝试以下regex:

/[.*?]( <.*?> )[(.*?)]/g

,用

代替
"[$2]$1"

让我们先做一些假设。

  1. 格式为[hh:mm:ss]的时间戳,10以下的秒/分表示为01等。
  2. person字符串不包含"["

那么下面的正则表达式将工作:

^[d{2}:d{2}:d{2}]([^[]++)([d{2}:d{2}:d{2}])(.*)$

下面是一个用Java编写的测试用例:

public static void main(String[] args) {
    final String[] strings = {"[AA:BB:CC] <Person1> [re:al:ts] BLAH BLAH BLAH",
        "[12:12:11] <Person2> [14:10:25] BLAH BLAH BLAH",
        "[12:12:11] <Person3> [14:10:25] BLAH BLAH BLAH",
        "[12:12:11] <Person4> [14:10:25] BLAH BLAH BLAH"};
    final Pattern pattern = Pattern.compile("^\[\d{2}:\d{2}:\d{2}\]([^\[]++)(\[\d{2}:\d{2}:\d{2}\])(.*)$");
    for(final String string : strings) {
        final Matcher matcher = pattern.matcher(string);
        if(matcher.matches()) {
            System.out.println(matcher.group(2) + matcher.group(1) + matcher.group(3));
        }
    }
}
输出:

[14:10:25] <Person2>  BLAH BLAH BLAH
[14:10:25] <Person3>  BLAH BLAH BLAH
[14:10:25] <Person4>  BLAH BLAH BLAH

相关内容

  • 没有找到相关文章

最新更新