2

code_number を抽出する正規表現が必要です。要件は次のとおりです。

  • 長さは 5 文字である必要があります
  • どの位置にも少なくとも 1 つの数字が含まれている必要があります
  • どの位置にも少なくとも 1 つの文字が含まれている必要があります

理想的には、これは 1 つの正規表現のみを使用して行う必要があります。

次の正規表現では、私はほとんどそこにいます。問題は、この正規表現が3番目の要件に準拠していないこと11111です。少なくとも1文字がないため、一致する必要はありません

$regex = '~\b(?=[a-zA-Z0-9]{5}\b)[a-zA-Z0-9]*\d[a-zA-Z0-9]*~';
$sms = ' 11111 keyrod  07:30 02.10.2013';

preg_match($regex, $sms, $matches);

print_r($matches); // print array([0] => 11111)

この正規表現を変更して、数字のみの文字列と一致しないようにするにはどうすればよいですか?

4

2 に答える 2

2

記述したルールに基づいて、文字列内の何も$sms一致しません。しかし、これらのルールに基づいて、これを試してください:

preg_match('~\b(?=[a-z0-9]{0,4}[a-z])(?=[a-z0-9]{0,4}[0-9])[a-z0-9]{5}\b~i', $subject, $matches);

サンプル文字列と Casimir のサンプル文字列を使用: http://codepad.viper-7.com/NA2mI5

出力:

//Your example string:
Array
(
)

//Other sample string:
Array
(
    [0] => abcd4
)
于 2013-05-31T22:18:40.123 に答える
1

これを試して:

$subject = ' :::5: abcde4 abcd4 12345 abcde :a:1:';

$regex = '~(?<= |^)(?=\S{0,4}\d)(?=\S{0,4}[a-z])\S{5}(?= |$)~i';

preg_match_all($regex, $subject, $matches);

print_r($matches);

説明:

(?<=)(?=)は、それぞれ後読みアサーションと先読みアサーションです。彼らは前後に状態をテストし、文字を食べません. (それらはゼロ幅です)

この場合:

(?<= |^)  --> a space or the beginning of the string before
(?= |$)   --> a space or the end of the string after

文字クラス:

\S  --> all characters that are not white (space, tab, newline..)

状況、契約条項:

先読みによって少なくとも 1 桁が強制されます。

(?=\S{0,4}\d)0 ~ 4 個の空白以外の文字と 1 つの数字があります。つまり、次のことができます。

1
x1
xx1
xxx1
xxxx1

の文字も同じです(?=\S{0,4}[a-z])

文字列の文字数は、\S{5}前後のすべての非白文字を禁止する最初と最後のルックアラウンドで強制されます。

于 2013-05-31T21:39:40.593 に答える