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

要拆分您的字符串并同时检查第一项是否为单个字母,您可以使用以下模式:

$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

使用explode或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 回答