1

入力例

vulture (wing)
tabulations: one leg; two legs; flying
father; master; patriarch    
mat (box)
pedistal; blockade; pilar
animal belly (oval)
old style: naval
jackal's belly; jester    slope of hill (arch)
key; visible; enlightened

基本的に、私はいくつかのより複雑な正規表現コマンドで問題を抱えています。私が見つけた正規表現を使用するコードのほとんどは非常に単純ですが、うまくいけば、非常に多くの場所で使用できます。私がやろうとしていることの種類を見て、それを変換できるかどうかを確認してください。

  1. 中括弧「(」と「)」の間に1つまたは複数の単語を配列します。
  2. xor 4スペースで終わる改行に続く最初の単語を配列し、次に閉じ中括弧 ")"、スペースと開き中括弧 "("、およびスペースと開き中括弧 "("までのドキュメントの最初の単語。
  3. セミコロンのある行では、セミコロンで区切られた単語を配列します。最後のセミコロンの後の単語を取得しますが、改行または4つの連続したスペースの後の単語は取得しません。文字列「tabulations:」で始まる行の単語は、文字列「tabulations:」で始まる行にセミコロンが付いていても、この配列に含めないでください。中括弧で終わる改行の場合、「)」はセミコロンを含む行の前にあり、代わりに「tabulations」「noalternates」で始まらない。
  4. 文字列「oldstyle:」で始まる行で、コロンの後に改行の前にある1つまたは複数の単語を取得します。中括弧「)」で終わる改行が「tabulations:」の前にある場合-開始行では、代わりに「古いスタイルなし」を配列に追加します。
  5. 文字列「tabulations:」で始まる行を除いて、3と同じです。中括弧「)」で終わる改行が「tabulations:」の前にある場合-開始行の代わりに、配列に「notabulations」を追加します。

私はPHPを介してこれを行う方法を理解しようとしていますが、誰かがこれらの要求を任意の言語、特にphp、C ++、javascript、またはバッチで処理できれば幸いです。また、パズル愛好家にとっても、これらすべてを表示するのは非常に難しいことも知っています。ですから、完全な回答が得られたらすぐに100ボーナスポイントを約束します。

-編集-

私が取り組んでいた最初の解決策

さて、私が取り組んでいた最初の解決策は3を解決することです。セミコロンで行を壊してみました。それから、データを1行ずつ取得して、さらに編集したいと思っていました。

$input = file_get_contents('explode.txt');
foreach(explode("\n", $input) as $line){
  $words = explode(';', $line); 
  foreach($words as $word){
  echo $word;
  }
}

基本的に、出力を見ると、データはすでに存在していたのと同じ形式になり、セミコロンを差し引くだけです。これはあまり役に立たなかったので、やめることにしました。

私が取り組んでいる2番目の解決策

これは、次のコード行に基づいていますpreg_match_all('/\;([^;]+)\}/', $myFile, $matches)

EPBとfgeのおかげで、質問のパート1に対する実用的な解決策があります。

$myFile = file_get_contents('fakexample.txt');
function get_between($startString, $endString, $myFile){
  //Escape start and end strings.
  $startStringSafe = preg_quote($startString, '/');
  $endStringSafe = preg_quote($endString, '/');
  //non-greedy match any character between start and end strings. 
  //s modifier should make it also match newlines.
  preg_match_all("/$startStringSafe(.*?)$endStringSafe/s", $myFile, $matches);
  return $matches;
}
$list = get_between("(", ")", $myFile);
foreach($list[1] as $list){
  echo $list."\n";
}

私が抱えていたいくつかの問題は、RegExを正しく使用していないことでした。ArrayArray戻りの問題は、$matchesをプライベート関数に返すようにpreg_match_all関数をカプセル化しなかったことが原因だと思います。まだわかりません。file_get_contents()また、この関数を使用してファイルを読み取る必要があるかどうかもまだわかりません。

3番目の解決策の試み

それで、私はこれにどのようにアプローチしたいかという最初の考えを持っていました、そして私はそれを自分のやり方でやろうと決心しました。繰り返しになりますが、質問1が最も簡単に思えたので、最初に質問1から始めました。例外が最も少ない

function find_between($input,$start,$end) {
  if (strpos($input,$start) === false || strpos($input,$end) === false) {
    return false;
  } else {
    $start_position = strpos($input,$start)+strlen($start);
    $end_position = strpos($input,$end);
    return substr($input,$start_position,$end_position-$start_position);
  }
}

$myFile = file_get_contents('explode.txt');

$output = find_between($myFile,'(',')');

echo $output;

私の知る限り、これはうまくいくでしょう。私が抱えている問題は再帰です。試しforeach($output as $output){echo $output;}ましたが、エラーが発生しました。それは、私が再発しておらず、配列されていないためだということは私には明らかなようです。私がこの道に沿って立ち止まった理由は、私が失敗する運命にあると何人かのプログラマーから言われたからです。そのため、現在、ソリューション2の作業に戻っています。

4

1 に答える 1