2012-02-28 29 views
0

你好,我写了一个正则表达式用于交换的名称和sourname:正则表达式:确定一个字符串名称Sourname

find \"([A-Z][a-z]+)\s([A-Z][a-z]+)\" replace "\2 \1" 

但是现在我发现,我不应该掉一切,我发现里面括号,但只有particoular候选人的名字,如:

  • 李四
  • 杰恩·爱

例如,如果我找到Jayne Doe,它不应该交换(所以\“(Eyre | Doe)\ s(John | Jayne)\”被排除在可能的解决方案之外)。

有任何建议。谢谢?

+0

什么excactly是区分名从那些被切换的属性不应该是? – 2012-02-28 16:35:28

+0

我应该只开关只能姓名李四和杰恩爱。未混合的名称和Sournames像杰恩李四或约翰·爱。 编辑:我的名字和sournames的夫妇应该被交换名单。 – 2012-02-28 16:50:10

回答

1

假设名称的数量来进行切换相当小,这可能会为你工作:

(?: (?<A>John)\s(?<B>Doe) | (?<A>Jayne)\s(?<B>Eyre) | (?<B>\w+)\s(?<A>\w+)) 

我已经包括了可读性空白;一定要把它拿出来或者使用忽略它的正则表达式选项。我使用Expresso,所以正则表达式使用.Net语法,但我认为您可以根据需要调整它。

替换正则表达式是:

${B} ${A} 

正则表达式具有3个替代品; 2个(或更多)用于我们要切换的名称,另一个用于所有其他不应该切换的名称。名称部分由替换正则表达式用来执行切换的命名捕获组(A & B)定义。关键在于,在第三种选择中,我们交换命名的捕获组,以便我们不想切换的名称实际被切换,但不起作用。

更复杂的名称变化(约翰·C·赖利,奥莉维亚·纽顿 - 约翰)将无法正常工作,但你原来的正则表达式保持它的简单,我也跟着。

更新的答案......

似乎Flex的正则表达式不支持命名组在更换正则表达式。试验后,我拿出了我最初的想法的变化,只有使用编号的捕获组,似乎工作:

(John)\s(Doe)|(Jayne)\s(Eyre)|(\w+)\s(\w+) 

更换的正则表达式是:

$2$4$5 $1$3$6 

这是相当多的比原来的要少,但是,如果要切换的名称数量合理,这可能是可行的。在我的测试中,上述正则表达式和替换正则表达式和下面的输入给定:

John Doe 
Jayne Eyre 
Bob Smith 

我得到了以下的输出:

Doe John 
Eyre Jayne 
Bob Smith 
+0

Ok Darril。谢谢到目前为止,我来到这个正则表达式**([0-9] + \ s *,\ s *)?“((Pink)\ s(Dolly)|(Doe)\ s(John)|(Eyre )\ s(Jane))\“**但是当我尝试x =(”Doe John“,x,v [ - e],44,”Eyre Jane“)上的匹配时;我得到了这些回应:[链接](http://pastebin.com/0T7dwx1J)。因为我只能使用\ p语法(p标识组号p)替换我有一个问题,因为Jayne Eire与john doe不在同一个匹配数 – 2012-02-29 08:47:36

+0

您使用Mattias什么语言/正则表达式风格?也许我可以帮助调整正则表达式来处理它。你能把你的输入文本的样本放在pastebin中吗?我想你在原始问题中保持简单,但现在我不清楚,认为看看它的真实性会有所帮助。 – Darryl 2012-02-29 16:07:13

+0

我必须在(f)lex或alex的语法中提供它们。我正在使用调节器进行测试。 – 2012-02-29 16:39:41

相关问题