2012-02-28 26 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

相關問題