2011-12-23 30 views
12

Tôi muốn thêm dấu cách vào một chuỗi trên các chữ cái viết hoa bằng cách sử dụng phương thức PHP như preg_replace() và regex, nhưng tôi chỉ muốn thêm dấu cách trên chữ hoa đầu tiên khi chúng liên tục. Tôi cũng muốn các regex biết rằng thủ đô cuối cùng trong một chuỗi liên tục của thủ đô nên là thủ đô tiếp theo để đặt một không gian trước đây.Làm cách nào để thêm không gian bằng chuỗi ở các chữ cái viết hoa, nhưng giữ các thủ đô liên tục với nhau bằng PHP và Regex?

Những chuỗi là những ví dụ:

 
TodayILiveInTheUSAWithSimon 
USAToday 
IAmSOOOBored 

trở thành:

 
Today I Live In The USA With Simon 
USA Today 
I Am SOOO Bored 

này có thể được thực hiện, và làm thế nào?

Câu hỏi này (Regular expression, split string by capital letter but ignore TLA), dường như thực hiện việc này với .net.

LÀM VIỆC GIẢI PHÁP

Đây là mã hoàn chỉnh mà tôi sử dụng:

$string = 'TodayILiveInTheUSAWithSimon'; 
$regex = '/(?<!^)((?<![[:upper:]])[[:upper:]]|[[:upper:]](?![[:upper:]]))/'; 
$string = preg_replace($regex, ' $1', $string); 

Cả hai công việc của những regex:

/(?<!^)((?<![[:upper:]])[[:upper:]]|[[:upper:]](?![[:upper:]]))/ 
/((?<=[a-z])(?=[A-Z])|(?=[A-Z][a-z]))/ 

Người đầu tiên là từ @ Regexident của giải pháp bên dưới và rất nhanh hơn một chút so với phiên bản thứ hai.

Trả lời

10

Find:

(?<!^)((?<![[:upper:]])[[:upper:]]|[[:upper:]](?![[:upper:]])) 

Thay thế:

$1 

lưu ý không gian trước khi $1

Edit: sửa chữa.

+0

Tôi nên sử dụng phương pháp PHP nào để thực hiện điều này với regex này? –

+0

@ T.BrianJones: Đó sẽ là [preg_replace] (http://php.net/manual/en/function.preg-replace.php). – Regexident

+0

Tôi nhận được lỗi sau: 'preg_replace(): Biên dịch không thành công: POSIX được đặt tên các lớp chỉ được hỗ trợ trong một lớp ở offset 4' khi tôi thực hiện điều này:' echo preg_replace ('((?

Các vấn đề liên quan