2015-07-21 66 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]);,则可以将其重新转换为字符串。

相关问题