1

そこで私は、ユーザーがPokerStars などのサイトからポーカー ハンドの履歴を入力してハンドを表示できるようにするプロジェクトに取り組んでいます。

正規表現はこれに最適なツールのようですが、正規表現の知識を「ほとんどない」とランク付けしています。

だから私はPHPを使用して、このテキストブロックを1行ずつ、次のような行でループしています:

Seat 1: fabulous29 (835 in chips)

Seat 2: Nioreh_21 (6465 in chips)

Seat 3: Big Loads (3465 in chips)

Seat 4: Sauchie (2060 in chips)

シートを抽出したいnumber, name, & chip countのでフォーマットは

Seat [number]: [letters&numbers&characters] ([number] in chips)

どこから始めればいいのか、これを最適化するためにどのコマンドを使用すべきなのか、まったくわかりません。

PHP 正規表現のチュートリアルへのリンクや、使用する必要があるコマンドの名前であっても、アドバイスをいただければ幸いです。

4

11 に答える 11

4

試してみないと正確に何を使用すればよいか完全にはわかりませんが、正規表現を検証するために常に使用している優れたツールはRegExrです。これは、リアルタイムマッチングやライブラリなど、正規表現を試すための優れたフラッシュインターフェイスを提供します使用する事前定義されたスニペットの。間違いなく素晴らしい時間の節約になります:)

于 2008-08-19T17:16:20.690 に答える
4

このような何かがトリックを行うかもしれません:

/Seat (\d+): ([^\(]+) \((\d+)in chips\)/

また、正規表現の仕組みに関するいくつかの基本的な説明:

  • \d = 数字。

  • \<character> = 文字クラスまたは部分式の一部でない場合、文字をエスケープします。例えば:

    \t はタブをレンダリングし、一方\\tは "\t" をレンダリングします (バックスラッシュがエスケープされているため)。

  • + = 前の要素の 1 つ以上。

  • * = 0 個以上の前の要素。

  • [ ] = ブラケット式。括弧内の任意の文字に一致します。範囲でも動作します (例: AZ)。

  • [^ ] = 括弧内にない任意の文字に一致します。

  • ( ) = マークされた部分式。この中で一致したデータは、後で呼び出すことができます。

とにかく使うことにしました

([^\(]+)

この例では、スペースを含む名前が提供されているためです (例の座席 3)。これが何をするかというと、開きかっこに遭遇するポイントまで、任意の文字に一致するということです。これにより、部分式の最後に空白が残ります (例で提供されているデータを使用)。ただし、これは PHP の trim() コマンドを使用して簡単に取り除くことができます。

スペースを使わずに英数字のみに一致させたい場合は、次のようにすることができます。

([A-Za-z0-9-_]+)

これは、任意の文字 (A ~ Z 内、大文字と小文字の両方)、数字、ハイフン、アンダースコアに一致します。

または、スペースを含む同じバリアント:

([A-Za-z0-9-_\s]+)

「\s」はスペースに評価されます。

お役に立てれば :)

于 2008-08-19T18:07:09.480 に答える
2

PHPマニュアルのPCREセクションを見てください。また、http://www.regular-expressions.info/は正規表現を学ぶのに最適なサイトです。免責事項: Regex は一度習得すると中毒性があります。

于 2008-08-19T17:13:19.400 に答える
2

PERL 互換の式にはより多くの機能があるため、私は常に PHP の REGEX に関数の preg_ セットを使用します。その追加機能は必ずしもここで機能するわけではありませんが、より高速であるはずなので、とにかくそれらを使用しないのはなぜですか?

式については、これを試してください:

/Seat (\d+): ([^ ]+) \((\d+)/

各行で preg_match() を使用して、結果を配列に格納できます。その後、それらの結果を取得して、好きなように操作できます。

編集:

ところで、 (行ごとにループする代わりに) テキストのブロック全体に対してpreg _match all を実行し、その方法で結果を取得することもできます。_

于 2008-08-19T17:18:52.010 に答える
1

preg_matchをチェックしてください。おそらく次のようなものを探しています...

<?php
$str = 'Seat 1: fabulous29 (835 in chips)';
preg_match('/Seat (?<seatNo>\d+): (?<name>\w+) \((?<chipCnt>\d+) in chips\)/', $str, $matches);
print_r($matches);
?>

*私がphpをやったのは久しぶりなので、これは多少ずれているかもしれません.*

于 2008-08-19T17:29:09.633 に答える
1

回答が非常に遅いかもしれませんが、私は回答に興味があります

Seat\s(\d):\s([\w\s]+)\s\((\d+).*\)

http://regex101.com/r/cU7yD7/1

于 2014-10-29T06:40:36.290 に答える
0

入力文字列全体を一度に処理するには、preg_match_all()

preg_match_all('/Seat (\d+): \w+ \((\d+) in chips\)/', $preg_match_all, $matches);

入力文字列の場合、$matchesのvar_dumpは次のようになります。

array
  0 => 
    array
      0 => string 'Seat 1: fabulous29 (835 in chips)' (length=33)
      1 => string 'Seat 2: Nioreh_21 (6465 in chips)' (length=33)
      2 => string 'Seat 4: Sauchie (2060 in chips)' (length=31)
  1 => 
    array
      0 => string '1' (length=1)
      1 => string '2' (length=1)
      2 => string '4' (length=1)
  2 => 
    array
      0 => string '835' (length=3)
      1 => string '6465' (length=4)
      2 => string '2060' (length=4)

正規表現の学習について:正規表現の習得、第3版を入手してください。あなたが本当に正規表現を学びたいのなら、この本に近づくものは他にありません。正規表現の決定的なガイドであるにもかかわらず、この本は非常に初心者に優しいです。

于 2008-08-20T07:35:46.483 に答える
0

このコードを試してください。わたしにはできる

以下の文字列の行があるとしましょう

$string1 = "Seat 1: fabulous29 (835 in chips)";
$string2 = "Seat 2: Nioreh_21 (6465 in chips)";
$string3 = "Seat 3: Big Loads (3465 in chips)";
$string4 = "Seat 4: Sauchie (2060 in chips)";

配列に追加

$lines = array($string1,$string2,$string3,$string4);
foreach($lines as $line )
{
  $seatArray = explode(":", $line);
  $seat = explode(" ",$seatArray[0]);
  $seatNumber = $seat[1];

  $usernameArray = explode("(",$seatArray[1]);
  $username = trim($usernameArray[0]);

  $chipArray = explode(" ",$usernameArray[1]);
  $chipNumber = $chipArray[0]; 

  echo "<br>"."Seat [".$seatNumber."]: [". $username."] ([".$chipNumber."] in chips)";
}
于 2013-10-14T12:47:16.690 に答える
0

これが私が現在使用しているものです:

preg_match("/(Seat \d+: [A-Za-z0-9 _-]+) \((\d+) in chips\)/",$line)
于 2008-08-19T17:27:33.787 に答える
-1
Seat [number]: [letters&numbers&characters] ([number] in chips)

正規表現は次のようになります

Seat (\d+): ([a-zA-Z0-9]+) \((\d+) in chips\)

括弧を使用すると、グループ内の座席番号、名前、およびチップの数をキャプチャできます。

于 2008-08-19T17:22:46.293 に答える
-1

ファイルを改行で分割し、各行をループして次のロジックを適用する必要があります

$seat = 0;
$name = 1;
$chips = 2;

foreach( $string in $file ) {
  if (preg_match("Seat ([1-0]): ([A-Za-z_0-9]*) \(([1-0]*) in chips\)", $string, $matches)) {
    echo "Seat: " . $matches[$seat] . "<br>";
    echo "Name: " . $matches[$name] . "<br>";
    echo "Chips: " . $matches[$chips] . "<br>";
  }
}

私はこのコードを実行していないので、いくつかのエラーを修正する必要があるかもしれません...

于 2008-08-19T17:23:04.513 に答える