0

我有一个清单;

D.默里 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 个模式串在一起。

4

3 回答 3

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's answer 的评论中所指出的那样,空格仅与文字空格字符匹配 chr(32)- 如果您想允许任何空格(空格、制表符、换行符等),请\s改用。

于 2012-09-16T20:24:16.010 回答
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#">
于 2012-09-16T18:46:54.437 回答
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>
于 2012-09-19T05:06:13.000 回答