CFML RegEx - 我需要从列表中提取aplh-number-number-number-number-number的模式

时间:2012-09-16 18:32:10

标签: regex coldfusion

我有一个清单;

D.Murray 20 131 6.6 48 0 A.Bradshaw 17 78 4.6 33 1 T.Romo 5 12 2.4 9 0 D.Wilson 2 4 2.0 3 0 L.Vickers 1 0 0.0 0 0

我需要提取5个项目中的每一个。由于没有分隔符,我想我会尝试RegEx。但是,我不明白如何将6种模式串联在一起。

3 个答案:

答案 0 :(得分:1)

另一种选择......

如果一般模式是一致的但是数字部分变量,则可以在名称前面的空格上拆分,例如

<cfsavecontent variable="input">D.Murray 20 131 6.6 48 0 A.Bradshaw 17 78 4.6 33 1 T.Romo 5 12 2.4 9 0 D.Wilson 2 4 2.0 3 0 L.Vickers 1 0 0.0 0 0</cfsavecontent>

<cfset matches = input.split(' (?=[A-Z]\.)') />

<cfdump var=#matches# />

(?= .. )部分是前瞻,它确认其中的子模式在该位置匹配,但不包括它作为实际匹配文本的一部分。 (因此在这种情况下,只有空格用作拆分分隔符。)

另外,正如Adam在对Ray的回答的评论中指出的那样,空格只匹配文字空间字符 - chr(32) - 如果你想允许任何空格(空格,制表符) ,换行等)然后使用\s代替。

答案 1 :(得分:0)

所以假设我上面的评论没问题,这对我来说没问题。

<cfset input = "D.Murray 20 131 6.6 48 0 A.Bradshaw 17 78 4.6 33 1 T.Romo 5 12 2.4 9 0 D.Wilson 2 4 2.0 3 0 L.Vickers 1 0 0.0 0 0">

<cfset pattern = "[a-zA-Z\.]+ [\d\.]+ [\d\.]+ [\d\.]+ [\d\.]+ [\d\.]+">
<cfset matches = reMatch(pattern,input)>

<cfdump var="#matches#">

答案 2 :(得分:0)

您是否希望将结果数据放在以空格分隔的列表数组中?

<cfscript>
var data = "D.Murray 20 131 6.6 48 0 A.Bradshaw 17 78 4.6 33 1 T.Romo 5 12 2.4 9 0 D.Wilson 2 4 2.0 3 0 L.Vickers 1 0 0.0 0 0";

// inject "|" between each set of 6 variables
var dataPipeList = data.replaceAll('(([^ ]+ ){5}[^ ]+) ','$1|');

// now convert your piped list into an array of space delimited strings
var dataArray = listToArray(dataPipeList,'|');

// eg.
dataArray == [
    'D.Murray 20 131 6.6 48 0',
    'A.Bradshaw 17 78 4.6 33 1',
    'T.Romo 5 12 2.4 9 0',
    'D.Wilson 2 4 2.0 3 0',
    'L.Vickers 1 0 0.0 0 0'
]
</cfscript>

或者你想要一个数组数组?

<cfscript>
var data = "D.Murray 20 131 6.6 48 0 A.Bradshaw 17 78 4.6 33 1 T.Romo 5 12 2.4 9 0 D.Wilson 2 4 2.0 3 0 L.Vickers 1 0 0.0 0 0";

// split into an array at every space
var temp = listToArray(data,' ');

// loop the array in steps of 6, adding each to a new array
var dataArray = [];
for ( var i = 1; i <= arrayLen( temp ); i = i + 6 ) {
    arrayAppend( dataArray, [
        temp[i],
        temp[i+1],
        temp[i+2],
        temp[i+3],
        temp[i+4],
        temp[i+5]
    ] );
}

// eg.
dataArray == [
    [ 'D.Murray', '20', '131', '6.6', '48', '0' ],
    [ 'A.Bradshaw', '17', '78', '4.6', '33', '1',
    [ 'T.Romo', '5', '12', '2.4', '9', '0' ],
    [ 'D.Wilson', '2', '4', '2.0', '3', '0' ],
    [ 'L.Vickers', '1', '0', '0.0', '0', '0' ]
]
</cfscript>

您甚至可以使用Java regex Pattern类生成数组数组,如下所示:

<cfscript>
var data = "D.Murray 20 131 6.6 48 0 A.Bradshaw 17 78 4.6 33 1 T.Romo 5 12 2.4 9 0 D.Wilson 2 4 2.0 3 0 L.Vickers 1 0 0.0 0 0";

// build a regex pattern
var regex = '([a-zA-Z.]+) ([0-9.]+) ([0-9.]+) ([0-9.]+) ([0-9.]+) ([0-9.]+)';
var pattern = createObject('java','java.util.regex.Pattern').compile(regex);

// get a matcher for the data
var matcher = pattern.matcher(data);

// build an array from the matched strings
var dataArray = [];
while ( matcher.find() ) {
    arrayAppend( dataArray, [
        matcher.group(1),
        matcher.group(2),
        matcher.group(3),
        matcher.group(4),
        matcher.group(5),
        matcher.group(6)
] );
}

// eg.
dataArray == [
    [ 'D.Murray', '20', '131', '6.6', '48', '0' ],
    [ 'A.Bradshaw', '17', '78', '4.6', '33', '1',
    [ 'T.Romo', '5', '12', '2.4', '9', '0' ],
    [ 'D.Wilson', '2', '4', '2.0', '3', '0' ],
    [ 'L.Vickers', '1', '0', '0.0', '0', '0' ]
]
</cfscript>