正则表达式:使用Name Surname标识字符串

时间:2012-02-28 16:32:22

标签: regex

您好我已经编写了一个正则表达式来交换名称和sourname:

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

但是我现在发现我不应该交换我在括号内找到的所有内容,而只是交换特定的候选名称,例如:

  • John Doe
  • Jayne Eyre

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

任何建议。感谢?

1 个答案:

答案 0 :(得分:1)

假设要切换的名称数量相当少,这可能对您有用:

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

我已将白色空间包含在内以便于阅读;一定要把它取出或使用忽略它的正则表达式选项。我使用Expresso,因此正则表达式采用.Net语法,但我认为您可以根据需要进行调整。

替换正则表达式是:

${B} ${A}

正则表达式有3种选择; 2(或更多)用于我们要切换的名称,以及一个用于不应切换的所有其他名称。名称部分由命名捕获组(A&amp; B)定义,替换正则表达式使用它们来进行切换。诀窍就是在第三种方法中,我们交换命名的捕获组,以便我们不想切换的名称实际上是切换的,但是没有效果。

更复杂的名称变体(John C. Reilly,Olivia Newton-John)将无法正常工作,但正如您原来的正则表达式一样简单,我也会效仿。

更新回答......

似乎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