2015-07-21 67 views
0

我想字符串格式轉換正則表達式字符串重組作者名字,姓氏,職務

The European Union - A Very Short Introduction - Pinder, John 

John Pinder - The European Union - A Very Short Introduction 

我有關於「平德」和「約翰」匹配麻煩以所需的方式重新格式化。

+0

什麼正則表達式工具? – dawg

+1

你期望什麼是這個排列?例如,如果標題不包含破折號而該名稱不是_last,first_的形式?例如:'歐盟簡介 - 約翰·皮德爾'我想說這不是通過你現在的例子來回答的。否則,它的這個[^ [^ \ S \ r \ n] *(。*?)[^ \ S \ r \ n] * - [^ \ S \ r \ n] *(?:([^ - , \ r \ n]] +?)?,??[^ \ S \ r \ n] *([^ - \ r \ n] +?)?[^ \ S \ r \ n] * $' – sln

+0

好點 - 在我的情況下,預計會有一些排列,雖然我明白一些數據集可能包括多個作者,標點符號作者名稱,帶有逗號的書名等。我沒有使用程序化正則表達式框架,但實際上是插入匹配並將字符串替換爲一個現有的工具。 – blaster

回答

1

您可以使用:

^(.*?)(?:-\s+(\w+),\s+(\w+))$ 

Demo

如果你可以有多個名字的作者(如 '克勞塞維茨,卡爾')這是不行的。相反,也許:

^(.*)(?:-\s+([^,]+?),\s+(\w+))$ 

Demo 2

+0

非常有幫助 - 謝謝!它效果很好,我瞭解了regex101.com。 。 。 ! – blaster

1

有很多方法可以解決這個問題,所有的問題都需要一些假設。這裏是一個解決方案...

^.+-\s+(.+),\s+(.+)$ 

regexper diagram enter image description here

它是通過消耗盡可能多的字符可能(高達第一個捕獲組,使用連字符和空格作爲分隔符)工作,然後它假定有一個逗號,後面跟着空格,用來區分名字和姓氏,它假定是字符串的結尾。

根據你對數據一致性的瞭解,這可能對你不起作用,但我認爲有一個解決方案不會限制字符的名稱,而是休息的格式。

+0

非常有幫助 - 謝謝!我以前沒有看過那個正則表達式可視化器。 – blaster

0

使用此代碼:

$code = preg_match_all('/(?:.*?) - (?:.*?) -(.*?),(.*)/', $string,$matches); 

這會給你一個數組,$matches[1]會給你的姓氏(在這種情況下, 「平德」)和$matches[2]會給你第一個名字(「約翰」)。如果您想使用$lastname = implode('',$matches[1]);,則可以將其重新轉換爲字符串。

相關問題