我有一个清单;
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种模式串联在一起。
答案 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>