簡體   English   中英

如何優化此正則表達式?

[英]How can I optimize this regular expression?

我有一個正則表達式,我想問一下是否可以簡化它?

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);

我認為這是您可以做的最好的事情:

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);

您可以先使用自由行距模式和一些注釋(這將有助於您和其他所有人的理解-簡化變得容易)。 注意,盡管如此,您現在必須在括號中放置文字空間:

/
(             # 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

我認為這不會比這簡單得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM