我有一个清单;
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 个模式串在一起。
我有一个清单;
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 个模式串在一起。
另外一个选项...
如果一般模式是一致的但数字部分变量,您可以在名称前的空格上拆分,例如
<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
改用。
所以假设我上面的评论没问题,这对我来说没问题。
<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#">
您是否希望将结果数据放在以空格分隔的列表数组中?
<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>