1

次のような文字列ラインがあります

A GOMUP 59/20 61/30 63/40 64/50 64/60 MUSVA DUTUM

この文字列に一致する正規表現を作成しようとしており、配列内の非空間テキストをそれぞれ返します。最初の文字が 1 桁であることを確認する必要があります。

私が試した正規表現は、期待どおりに機能しません

#^([A-Z])(?:\s(\S+))+#

戻り値

array(3) {
  [0]=>
  array(1) {
    [0]=>
    string(49) "A GOMUP 59/20 61/30 63/40 64/50 64/60 MUSVA DUTUM"
  }
  [1]=>
  array(1) {
    [0]=>
    string(1) "A"
  }
  [2]=>
  array(1) {
    [0]=>
    string(5) "DUTUM"
  }
}

帰りたい/帰りたい

array(10) {
  [0]=>
  array(1) {
    [0]=>
    string(49) "A GOMUP 59/20 61/30 63/40 64/50 64/60 MUSVA DUTUM"
  }
  [1]=>
  array(1) {
    [0]=>
    string(1) "A"
  }
  [2]=>
  array(1) {
    [0]=>
    string(5) "GOMUP"
  }
  [3]=>
  array(1) {
    [0]=>
    string(5) "59/20"
  }
  [4]=>
  array(1) {
    [0]=>
    string(5) "61/30"
  }
  [5]=>
  array(1) {
    [0]=>
    string(5) "63/40"
  }
  [6]=>
  array(1) {
    [0]=>
    string(5) "64/50"
  }
  [7]=>
  array(1) {
    [0]=>
    string(5) "64/60"
  }
  [8]=>
  array(1) {
    [0]=>
    string(5) "MUSVA"
  }
  [9]=>
  array(1) {
    [0]=>
    string(5) "DUTUM"
  }
}

これはどのように達成できますか?PHP で preg_match を使用しています。

4

3 に答える 3

2

文字列を分割し、同時に最初の項目が 1 文字であることを確認するには、次のパターンを使用できます。

$pattern = '~^[A-Z]\b|\G\s+\K\S+~';

$subject = 'A GOMUP 59/20 61/30 63/40 64/50 64/60 MUSVA DUTUM';

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

print_r($matches[0]);

以下を取得します。

Array
(
    [0] => A
    [1] => GOMUP
    [2] => 59/20
    [3] => 61/30
    [4] => 63/40
    [5] => 64/50
    [6] => 64/60
    [7] => MUSVA
    [8] => DUTUM
)

文字列をテストするZZ A GOMUP 59/20 61/30 63/40 64/50 64/60 MUSVA DUTUMと、パターンは失敗し、結果は返されません。

ただし、次のパターンを使用して、単一の文字で始まる最初の部分文字列を見つける可能性があります。

$pattern = '~^(?>\S{2,}\s+)*\K[A-Z]\b|\G\s+\K\S+~';



パターン 1 の詳細: ~^[A-Z]\b|\G\s+\K\S+~

~          # pattern delimiter
^          # begining of the string anchor
[A-Z]\b    # single uppercase letter with a word boundary
|          # OR
\G         # contiguous match from the last
\s+        # one or more white characters (spaces, tab, newlines...)
           # which can be replaced by ' +' for your example string
\K         # reset the match before (remove the spaces from the result)
\S+        # all that is not a space
~          # pattern delimiter

パターン 2 の詳細: ~^(?>\S{2,}\s+)*\K[A-Z]\b|\G\s+\K\S+~

~          # pattern delimiter
^          # begining of the string anchor
(?>        # open a group (atomic here but you can use '(?:' instead)
  \S{2,}   # a non space character repeated at least two times
  \s+      # one or more spaces
)*         # repeat the group zero or more times
\K         # reset the begining of the match

その後はPattern1のようになります。

于 2013-07-21T11:35:42.027 に答える
0

PHP の正規表現では、一致するグループの数を可変にすることはできないため、文字列のすべての部分に対してグループを作成する必要があります。たとえば、http: //www.regular-expressions.info/captureall.htmlを参照してください。

爆発または preg_split を使用して文字列を空白で分割し、その後で追加のチェックを行う方が簡単です。

于 2013-07-21T08:32:52.350 に答える
0
if (preg_match_all('#([A-Z]+)|([\d]+/[\d]+)#', $text, $matches)){
    print_r($matches[0]);
}

出力:

Array
(
    [0] => A
    [1] => GOMUP
    [2] => 59/20
    [3] => 61/30
    [4] => 63/40
    [5] => 64/50
    [6] => 64/60
    [7] => MUSVA
    [8] => DUTUM
)
于 2013-07-21T08:43:58.913 に答える