是数字,那么在perl regex中使用
所以这里我有来自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,…
dd
而不是..
。如果您不使用多行匹配,请尝试以下regex:
/[.*?]( <.*?> )[(.*?)]/g
,用
代替"[$2]$1"
让我们先做一些假设。
- 格式为[hh:mm:ss]的时间戳,10以下的秒/分表示为01等。
- 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