在模式匹配后尝试将字符串值解析为数组

时间:2015-03-28 21:22:16

标签: regex parsing match

我在文本文件中有以下几行:

<Entry>
    <Key argument="ComputerNames"/>
    <Value type="string" argument="localhost,localhost,engine1,engine2"/></Entry>
<Entry>
    <Key argument="BranchIDMultiple"/>
    <Value type="int" argument="1"/></Entry>

我知道如何找到拥有ComputerNames的行。我知道如何阅读下一行。

我需要按如下方式解析行,其中参数的数量可以是动态的。解析输出应为:

@result = $result[0]=localhost, $result[1]=localhost, $result[2]=engine1, $result[3]=engine2.    

必须至少有一个论点,但也可以有更多......

我无法构建正确的正则表达式来完成拆分。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

假设输入包含以下xml行。

由于您已经提到过您知道如何提取此行。我把那部分留给了你。

获得此行后,请使用以下正则表达式

String regex ="argument=\"[a-zA-Z0-9,]*\"" ;

Pattern pattern = Pattern.compile(regex);

Matcher matcher = pattern.matcher(input);
String[] op;
if(matcher.find())
 {
   op = input.subString(matcher.start(),matcher.end()).split(",");
 }

答案 1 :(得分:0)

好的,这就是我所拥有的:

---经过多次不同的试验,我终于能够得到一些有效的东西。见下文:

BEGIN { require 5.8.0; }

use strict; 
use warnings;

# string to test regular expressions
my $test_string = '<Value type="string" argument="400teets,localhost,localhost,engine1,engine2,engine50,engine100,100afdasfdas"/></Entry>';

# print out the initial string
print "The initial string is: $test_string\n\n";

# first set of arguments - all words that have a comma after them
my @first_words = ($test_string =~ /(\w+),/g);

# print first set of arguments
print "\nFirst set of arguments found\n";
foreach my $word (@first_words) {
    print "$word\n";
}

# second set of arguments - all words that have a comma before them
my @last_words = ($test_string =~ /,(\w+)/g);

#print second set of arguments
print "\nSecond set of arguments found\n";
foreach my $word (@last_words) {
    print "$word\n";
}

#merge the sets by popping the last element off of last_words array and pushing it into the first_words array
push(@first_words,pop(@last_words));

#print the results
print "\nMerged Sets\n";
foreach my $word (@first_words) {
    print "$word\n";
}

# END OF PROGRAM

---真的,如果你排除所有的打印陈述和评论,你真正需要的就是这三行:

my @first_words = ($test_string =~ /(\w+),/g);
my @last_words = ($test_string =~ /,(\w+)/g);
push(@first_words,pop(@last_words));

---这是输出:

初始字符串是:

找到第一组参数 400teets 本地主机 本地主机 引擎1 引擎2 engine50 engine100

找到第二组论点 本地主机 本地主机 引擎1 引擎2 engine50 engine100 100afdasfdas

合并集 400teets 本地主机 本地主机 引擎1 引擎2 engine50 engine100 100afdasfdas