次の 2 つの形式のいずれかを持つ数千の文字列があります。
SomeT1tle-ThatL00ks L1k3.this - $3.57 KnownWord
SomeT1tle-ThatL00ks L1k3.that - 4.5% KnownWord
このSomeT1tle-ThatL00ks L1ke.this
部分には、大文字と小文字、数字、ピリオド、ダッシュ、およびスペースを含めることができます。常にスペース-ダッシュ-スペースのパターンが続きます。
Title (スペース-ダッシュ-スペース区切りの前の部分) と の直前にある Amount を引き出したいKnownWord
。
したがって、これらの 2 つの文字列については、次のようにします。
SomeT1tle-ThatL00ks L1k3.this, $3.57
と
SomeT1tle-ThatL00ks L1k3.that, 4.5%
.
このコードは機能します (Perl の同等の正規表現を使用)
$my_string = "SomeT1tle-ThatL00ks L1k3.this - $3.57 KnownWord";
$pattern_title = "/^(.*?)\x20\x2d\x20/";
$pattern_amount = "/([0-9.$%]+) KnownWord$/";
preg_match_all($pattern_title, $my_string, $matches_title);
preg_match_all($pattern_amount, $my_string, $matches_amount);
echo $matches_title[1][0] . " " . $matches_amount[1][0] . "<br>";
両方のパターンをまとめてみました:
$pattern_together_doesnt_work = "/^(.*?)\x20\x2d\x20([0-9.$%]+) KnownWord$/";
ただし、パターンの最初の部分は、「怠惰な」部分 (.*?
ではなく.*
) であっても、常に全体に一致します。タイトル自体にどちらも含めることができるため、スペースとダッシュを否定的に一致させることはできません。
ヒントはありますか?