For PO boxes, you'll discover that it's not possible to cover all the cases. It's obviously something you probably don't want to hear, but thems is the breaks. It's very evident when one starts Googling around for the solution, because trust me I looked into this, there are many solutions. All of the solutions I've seen, I don't much care for.
So you have to go back to the rules/standards of what a PO box address comprises. One can find that out on Wikipedia. It's of the format PO Box, P.O. Box, Postal Office Box, P Office Box, Postal Box, Post Box, just to name some examples of the standard format that one bases his/her rules on when writing the regex to determine if the address is a PO box or not.
With that said, here is my solution. It's simple, because it has to be, there are too many dumb ways users will put in po box. And you have to assume p or postal or something p starts the address for a po box. That way you don't filter addresses that have some variant of the word p or o in a 123 po address format. I hope this makes sense.
/^p+(ostal|ost|\.| )*o*(ffice|\.| )*(box)*/i
The above can be tested on http://www.rubular.com, you'll need to remove the beginning and closing forward slash, and put the i (case insensitivity in the block the text field to the right of the closing forward slash.