1

5 つの単語を含む文字列があります。文字列の単語の 1 つはアマチュア無線コール サインであり、米国内の何千ものコール サインのいずれかである可能性があります。文字列からコール サインを抽出するには、以下のパターンを利用する必要があります。抽出する必要があるコール サインは、文字列内の 5 つの位置のいずれかにある可能性があります。数字が最初の文字になることも、数字が最後の文字になることもありません。文字列は、もともとテキスト ファイルから読み取られるため、実際には配列からまとめられます。

$string = $word[1] $word[2] $word[3] etc.... 

したがって、検索は文字列全体または配列の各部分に対して実行できます。

Patterns:
1 Number and 3 Letters Example: AB4C A4BC
1 Number and 4 Letters Example: A4BCD
1 Number and 5 Letters Example: AB4CDE

もう検索できなくなるまで、考えられることはすべて試しました。私はこれを考えすぎていると確信しています。

4

2 に答える 2

0

次のような 2 段階の正規表現を使用すると、次のようになります。

$str = "hello A4AB there BC5AD";
$signs = array();
preg_match_all('/[A-Z][A-Z\d]{1,3}[A-Z]/', $str, $possible_signs);
foreach($possible_signs[0] as $possible_sign)
    if (preg_match('/^\D+\d\D+$/', $possible_sign))
        array_push($signs, $possible_sign);

print_r($signs); //Array ([0] => A4AB [1] => BC5AD)

説明

これは、2 つのパターンを使用する正規表現アプローチです。一致ルールの正確な要件を満たすことができるとは思いません。

最初のパターンでは、次の要件が適用されます。

  • 部分文字列は大文字で始まり大文字で終わる
  • 部分文字列には、最初と最後の文字の間に他の大文字または数字のみが含まれています
  • 部分文字列は、全体で 6 文字以下です

複雑な REGEX の理由から (誰かが方法を知っていて、私を修正できる場合を除いて) 入りませんが、同じパターンでできないことは、1 つの数字のみが含まれるようにすることです

@jeroenの答えこれを単一のパターンで強制しますが、部分文字列の正しい長さを強制しません。いずれにせよ、2 番目のパターンが必要です。

したがって、最初の一致を取得した後、結果をループします。次に、それぞれを 2 番目のパターンに適用します。このパターンは、部分文字列に数字が1 つしかないことを単純に強制します。

その場合、部分文字列を青信号にして$signs配列に追加します。

お役に立てれば。

于 2012-08-18T23:25:31.257 に答える
0

他の単語に含まれる内容によって異なりますが、次のような正規表現を使用できます。

#\b[a-z]+\d[a-z]+\b#i
                    ^ case insensitive
                 ^^ a word boundary
           ^^^^^^ One or more letters
         ^^ One number

{1,3}文字の代わりに+for を使用して、1 ~ 3 文字のシーケンスにすることで、より制限を加えることができます。

完全な式は次のようになります。

$success = preg_match('#\b[a-z]+\d[a-z]+\b#i', $input_string, $matches);

where$matches[0]には一致した値が含まれます。マニュアルを参照してください。

于 2012-08-18T23:20:58.193 に答える