如何优化此正则表达式?

时间:2013-08-09 15:57:05

标签: php regex

我有一个正则表达式,我想问一下是否可以简化它?

preg_match_all('/([0-9]{2}\.[0-9]{2}\.[0-9]{4}) (([01]?[0-9]|2[0-3])\:[0-5][0-9]\:[0-5][0-9]?) поступление на сумму (\d+) WM([A-Z]) от корреспондента (\d+)/', $message->getMessageBody(), $info);

2 个答案:

答案 0 :(得分:1)

我认为这是你能做的最好的事情:

preg_match_all('/((?:\d\d\.){2}\d{4}) (([01]?\d|2[0-3])(:[0-5]\d){1,2}) поступление на сумму (\d+) WM([A-Z]) от корреспондента (\d+)/', $message, $info);

除非你不需要那些确切的词。然后你可以:

preg_match_all('/((?:\d\d\.){2}\d{4}) (([01]?\d|2[0-3])(:[0-5]\d){1,2})\D+(\d+) WM([A-Z])\D+(\d+)/', $message, $info);

答案 1 :(得分:0)

您可以从使用自由间距模式和一些注释开始(这将有助于您和其他人的理解 - 这使得简化更容易)。请注意,您现在必须在括号中加上文字空格,但是:

/
(             # group 1
  [0-9]{2}\.[0-9]{2}\.[0-9]{4}
              # match a date
)
[ ]
(             # group 2
  (           # group 3
    [01]?[0-9]# match an hour from 0 to 19
  |           # or
    2[0-3]    # match an hour from 20 to 23
  )
  \:       
  [0-5][0-9]  # minutes
  \:
  [0-5][0-9]? # seconds
)
[ ]поступление[ ]на[ ]сумму[ ]
              # literal text
(\d+)         # a number into group 4
[ ]WM         # literal text
([A-Z])       # a letter into group 5
[ ]от[ ]корреспондента[ ]
              # literal text
(\d+)         # a number into group 6
/x

现在我们不能简化最后的部分 - 除非你不想捕获带括号的东西,在这种情况下你可以简单地省略大部分括号。

您可以使用\d代替\d来略微缩短表达式,在这种情况下\d\d甚至比\d{2}更短。

接下来,没有必要逃避冒号。

最后,你的秒数似乎有些奇怪。如果您想允许一位数的秒数,请将0-5设为可选,而不是\d之后:

/
(             # group 1
  \d\d\.\d\d\.\d{4}
              # match a date
)
[ ]
(             # group 2
  (           # group 3
    [01]?\d   # match an hour from 0 to 19
  |           # or
    2[0-3]    # match an hour from 20 to 23
  )
  :       
  [0-5]\d     # minutes
  :
  [0-5]?\d    # seconds
)
[ ]поступление[ ]на[ ]сумму[ ]
              # literal text
(\d+)         # a number into group 4
[ ]WM         # literal text
([A-Z])       # a letter into group 5
[ ]от[ ]корреспондента[ ]
              # literal text
(\d+)         # a number into group 6
/x

我认为它不会比那简单得多。