3

我发现很难为这个问题想出一个合适的标题。因此,如果它具有误导性,如果您能帮助改进它,我将不胜感激。

我已经提取了一个 xml 文件的属性值,现在我得到了如下示例行中提到的输出:

category:buffer overflow  analyzer:data flow analyzer:buffer

我需要将其拆分为

category:buffer overflow
analyzer:data flow
analyzer:buffer

我不确定如何使用 Java、Perl 或 Python 来完成这项工作。

到目前为止,我所拥有的只是一个简单的 Perl 脚本,它将其拆分为“:”。

所有建议都会有所帮助。

4

4 回答 4

5

合适的正则表达式将起作用。这是 Pythonre模块的实现:

import re

s = 'category:buffer overflow  analyzer:data flow analyzer:buffer'

print(re.findall(r"(\w+:[\w ]+)(?: |$)", s))
#prints ['category:buffer overflow ', 'analyzer:data flow', 'analyzer:buffer']
于 2013-03-18T09:47:50.407 回答
3

这个sed 单线在这里工作:

sed -r 's/ ([^ ]+:)/\n\1/g' input

测试:

kent$  echo "category:buffer overflow  analyzer:data flow analyzer:buffer" |sed -r 's/ ([^ ]+:)/\n\1/g'                                                                     
category:buffer overflow 
analyzer:data flow
analyzer:buffer

这个java行也在这里工作:

System.out.println("category:buffer overflow  analyzer:data flow analyzer:buffer".replaceAll("\\s([^\\s]+:)", "\n$1"));

又一条蟒蛇线:

In [1]: import re

In [2]: s = 'category:buffer overflow  analyzer:data flow analyzer:buffer'                                                                                                 

In [3]: print re.sub(r"\s(?=[^\s]*:)",'\n',s)
category:buffer overflow 
analyzer:data flow
analyzer:buffer
于 2013-03-18T09:55:33.043 回答
1

在 Java 中,这看起来像这样:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Extractor {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Pattern pattern = Pattern
                .compile("(\\w+:[\\w ]+)(?: |$)");
        Matcher matcher = pattern
                .matcher("category:buffer overflow  analyzer:data flow analyzer:buffer");
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }

}
于 2013-03-18T09:59:12.743 回答
1

在 perl 中:

$s = "category:buffer overflow  analyzer:data flow analyzer:buffer";
$s .= " "; 
@keyz = split(/:[A-Za-z\d\s]*\s/, $s);
print "@keyz\n";
@params = split(/[A-Za-z\d]*:/, $s);
print "@params\n";

产生数组@keyz = ("category", "analyzer", "analyzer") 和数组@params=("buffer overflow", "data flow", "buffer")

于 2013-03-18T10:48:34.057 回答