0

リストがあります。

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つのパターンをつなぎ合わせる方法がわかりません。

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が指摘したように、スペースは文字通りのスペース文字にのみ一致します-- 空白(スペース、タブ、改行など)を許可したい場合は、代わりに使用chr(32)てください。\s

于 2012-09-16T20:24:16.010 に答える
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 に答える
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 に答える