2012-02-28 30 views
0

こんにちは私は名前とsournameを交換するための正規表現を書かれている。しかし、私は今、私は内部の括弧だけparticoularを見つけ、すべてを交換するべきではないことを発見した正規表現:名前Sournameで文字列を特定し

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

以下のような候補者名:

  • ジョン・ドウ
  • ジェインエア

たとえば、Jayne Doeが見つかった場合、スワップしないでください(\ "(Eyre | Doe)\ s(John | Jayne)\"は解決策から除外されます)。

アドバイスをお願いします。ありがとう?切り替えることが名前の数を想定し

+0

excactlyそのいけないものの中から切り替えることに名前を区別する性質とは何かあれ? –

+0

私はJohn DoeとJayne Eyreの名前のみを切り替えるべきです。 Jayne DoeやJohn Eyreのような名前とSournamesが混在することはありません。 編集:私は交換する必要がある名前とsournamesのカップルのリストを持っています。 –

答えて

1

が、これはあなたのために働くかもしれない、かなり小さいです:

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

私は読みやすくするために空白が含まれています。それを取り除くか、それを無視するregexオプションを使用してください。 Expressoを使ったので、regexesは.Net構文になっていますが、必要に応じてそれを調整することができます。

代替正規表現は次のとおりです。

${B} ${A} 

正規表現は3つの選択肢を持っています。切り替えたい名前の場合は2(またはそれ以上)、切り替えるべきでない他のすべての名前の場合は1つです。名前部分は、交換を行うために置換正規表現によって使用される名前付きキャプチャグループ(A & B)で定義されます。トリックは、3番目の選択肢では、名前を変更するキャプチャグループをスワップするので、切り替えたくない名前は実際には切り替わりますが、効果はありません。

もっと複雑な名前のバリエーション(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 
+0

Ok Darril。これまでのおかげで、この正規表現**([0-9] + \ s *、\ s *)になりましたか?\ "((Pink)\ s(Dolly)|(Doe)\ s(John)| )\ "**しかし、x =(" Doe John "、x、v [ - e]、44、" Eyre Jane ")で試合を試してみると、私はそれらの応答を得た:[リンク](http://pastebin.com/0T7dwx1J)。 Jayne Eireはjohn doeと同じ番号にないので、私は\ p構文(pはグループ番号pを特定する)を使うことができるので、問題があります。 –

+0

Mattiasを使用している言語/正規表現のフレーバーですか?たぶん、Regexesを調整して作業するのに役立つかもしれません。また、入力テキストのサンプルをpastebinに置くことができますか?私はあなたが元の質問でそれを単純にしていたと思いますが、今私は不明であり、それが本当にどのように見えるかは分かります。 – Darryl

+0

私はそれらを(f)lexまたはalexの構文で提供する必要があります。私はテストのためにレギュレータを使用しています。 –

関連する問題