您好我已经编写了一个正则表达式来交换名称和sourname:
find \"([A-Z][a-z]+)\s([A-Z][a-z]+)\" replace "\2 \1"
但是我现在发现我不应该交换我在括号内找到的所有内容,而只是交换特定的候选名称,例如:
例如,如果我找到Jayne Doe,就不应该交换它(所以“(Eyre | Doe)\ s(John | Jayne)\”被排除在可能的解决方案之外。)
任何建议。感谢?
答案 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