-1

私はこれに少し取り組んできましたが、私の正規表現は弱いです。

数値が整数(1桁)であるかどうかを確認し、整数である場合はそれに「.001」を追加する必要があります。問題は、値がコンマで区切られた行の途中にあることです。

MATERIALS、1,1,9999; 1 4PL1 PB_Mel ,, 1,6,0.173,0.173,0.375,0,0.375,0,0,0,0,2,0,1,1

する必要があります

MATERIALS、1,1,9999; 1 4PL1 PB_Mel ,, 1.001、6,0.173,0.173,0.375,0,0.375,0,0,0,0,2,0,1,1

  1. 行は「MATERIALS」で始まる必要があります。
  2. 複数のMATERIALS行があります。
  3. 値は常に5つのコンマの後になります。

私はこのような番号を置き換えることさえ試みていましたが、アプローチは完全に正しいとは思いません:

$stripped = preg_replace('/(MATERIALS)(,.*?){4}(,\d+?),/', '\2,', $stripped);

少なくとも条件付きで機能させるために、> ifプロセスのpreg_match_all>を実行しようとしましたが、それでも行を置き換える必要があります。

preg_match_all編集:ループを進めた行を忘れました。

preg_match_all('/MATERIALS.*/', $stripped, $materialsLines);
for($i=0;$i<sizeof($materialsLines[0]);$i++) {
            $section = explode(",",$materialsLines[0][$i]);
            if (strlen($section[5]) == 1) {
                $section[5] .= ".001";
            }
            $materialsLines[0][$i] = implode(",",$section);
        }
4

3 に答える 3

1

それは非常に簡単です:

$str = preg_replace('/^(MATERIALS,(?:[^,]*,){4}\d+)(?=,)/m', "$1.001", $str);

このデモを参照してください。

于 2012-11-16T00:11:56.423 に答える
0

これは機能する可能性があります:(ただし、文字列の構造全体をidkします)

$pattern = '#(MATERIALS,[0-9]{1},[0-9]{1},[0-9]{4};[^,]*,,[^,]),#';
$replacement = '${1}.001,'; // where ${1} references to pattern matches
$string = 'your string'
$matches  = preg_replace($pattern, $replacement, $string);
于 2012-11-15T23:22:00.953 に答える
0

なぜ正規表現を使用するのですか?文字列をカンマで分解し、[5]の値を確認して修正し、文字列を結合して戻すだけです。

$str = 'MATERIALS,1,1,9999;1 4PL1 PB_Mel,,1,6,0.173,0.173,0.375,0,0.375,0,0,0,0,2,0,1,1';
$line = explode(',',$str);
if(strpos($line[5],'.')===false){
    $line[5] .= '.001';
}
$str = implode(',', $line);

http://codepad.org/g4r3pLpS

ファイルから複数行を読み取る場合:

$file = file("someFile.txt");
foreach($file as $key=>$line){
    $line = explode(',', $line);
    if($line[0] == 'MATERIALS'){
        if(strpos($line[5],'.')!==false){
            $line[5] .= '.001';
            $file[$key] = implode(',', $line);
        }
    }
}
file_put_contents("someFile2.txt", implode('',$file));

何らかの理由で正規表現を使用する必要がある場合、これは私にとってはうまくいきました:

$str = 'MATERIALS,1,1,9999;1 4PL1 PB_Mel,,1,6,0.173,0.173,0.375,0,0.375,0,0,0,0,2,0,1,1
MATERIALS,1,1,9999;1 4PL1 PB_Mel,,1.101,6,0.173,0.173,0.375,0,0.375,0,0,0,0,2,0,1,1
FOO,1,1,9999;1 4PL1 PB_Mel,,1.1,6,0.173,0.173,0.375,0,0.375,0,0,0,0,2,0,1,1
BLAH,1,1,9999;1 4PL1 PB_Mel,,1,6,0.173,0.173,0.375,0,0.375,0,0,0,0,2,0,1,1
MATERIALS,1,1,9999;1 4PL1 PB_Mel,,567,6,0.173,0.173,0.375,0,0.375,0,0,0,0,2,0,1,1';

$str = preg_replace('/^(MATERIALS(,[^,]*){4},)(\d+),/m', '$1$3.001,', $str);
echo $str;

http://codepad.org/l7FfJlDe

于 2012-11-15T23:26:56.437 に答える