リストがあります。
D.マレー 20 131 6.6 48 0 A.ブラッドショー 17 78 4.6 33 1 T.ロモ 5 12 2.4 9 0 D.ウィルソン 2 4 2.0 3 0 L.ビッカース 1 0 0.0 0 0
5つのアイテムをそれぞれ抽出する必要があります。区切り文字がないので、RegEx を試してみようと思いました。しかし、6つのパターンをつなぎ合わせる方法がわかりません。
リストがあります。
D.マレー 20 131 6.6 48 0 A.ブラッドショー 17 78 4.6 33 1 T.ロモ 5 12 2.4 9 0 D.ウィルソン 2 4 2.0 3 0 L.ビッカース 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が指摘したように、スペースは文字通りのスペース文字にのみ一致します-- 空白(スペース、タブ、改行など)を許可したい場合は、代わりに使用しchr(32)
てください。\s
結果のデータをスペースで区切られたリストの配列に入れたいですか?
<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>
したがって、上記の私のコメントが問題ないと仮定すると、これは私にとっては問題なく機能しました。
<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#">