2011-07-26 51 views
2

我試圖讓一個字符串在字符串的每一處都有一個下劃線'_',以便使用戶更清楚。例如,如果我們有一個字符串'個人ID號',我想把它設置爲'personal_ID_number'。這是用C#編寫的。正則表達式換個案

謝謝,我感謝任何幫助,建議。

-sid

+0

在你的情況,你也替換爲下劃線空格。這也是你在找什麼?另外,你有什麼嘗試? – npinti

+0

白色空間不是問題,我只是試圖讓每一個案件的改變下劃線,我試圖在每一個大寫字母分割,沒有工作,現在我想檢查每一個字符爲它的情況和它的比較與之前和之後的每個角色的情況。的感謝 – Sid

+0

可能重複[.NET - ?你怎麼能拆分分隔的字符串到一個數組一個「帽」(http://stackoverflow.com/questions/155303/net-how-can-you-split-a-caps -derand-string-into-an-an-array) – GSerg

回答

5

上的情況下改變
您正在尋找這個替換(我刪除ID之前的空間,假設它一個錯字)

(?:(?<=[a-z])(?=[A-Z]))|(?:(?<=[A-Z])(?=[a-z])) 

它會轉變爲personalIDnumberpersonal_ID_number

查看一下here on Regexr

Lookbehind((?<=[a-z]))和lookahead((?=[A-Z]))構造匹配小寫字母和大寫字母之間的空字符串(或者在管道|後面的第二部分中),並將其替換爲下劃線。

具有可選的空白
的情況下改變替換如果你想在空格替換,只是包括lookarounds

(?:(?<=[a-z])\s*(?=[A-Z]))|(?:(?<=[A-Z])\s*(?=[a-z])) 

之間也將轉變personal IDnumberpersonal_ID_number

見這here on Regexr

更換O吶情況的變化,但每個單詞以大寫開頭
如果你說的每一個字以大寫字母開頭,那麼你就可以做到這一點

(?:(?<=[a-z])(?=[A-Z]))|(?:(?<=[A-Z])(?=[A-Z][a-z])) 

這將使從

PersonalIDNumber
JustAnotherTest
OtherWordWithID
SomeMORETest

Personal_ID_Number
Just_Another_Test
Other_Word_With_ID
Some_MORE_Test

看到這個here on Regexr

+0

謝謝stema,我試試吧,讓你知道。 – Sid

+0

對不起,這有效,但我有另一個案件失敗,如果我有'personelIDNumber',我想要'personal_ID_Number'。現在它給了personal_IDN_號碼 – Sid

+3

我應該如何區分最後一個大寫字母是否屬於最後一個單詞或者它是否是第一個大寫字母?我認爲沒有辦法,因爲這種模式不知道這個詞的意思。或者你說每個詞都以大寫字母開頭。 – stema

0

非正則表達式的解決方案(以防萬一)

string str = "personalIDnumber"; 
    var result = 
     Enumerable.Range(0, str.Length - 1) 
      .Where(i => char.IsUpper(str[i]) != char.IsUpper(str[i + 1])) 
      .ToList(); 

    string resultString = result.Aggregate(str, (current, i) => current.Insert(i + 1 + result.IndexOf(i), "_")); 

result存儲的其中一個_具有位置的列表被插入和所述Aggregate()函數插入它。

+0

我得到它的工作,我用 「([AZ] [AZ,0-9] +?!| [AZ] +([AZ]))(X?)」 與_ $ 1,和我同在_輸出如果字符串以大寫字母開頭,我將刪除第一個下劃線表單字符串。感謝大家。 – Sid

相關問題