2013-05-22 95 views
0

我有一個字符串,它包含一些id,基本上是一個字符串中的sql表達式。我需要以更友好的方式呈現給用戶,即。用數據庫中的名稱替換ID。問題是有些ID是單個數字,其他的是2位數字。所以當我搜索並替換一個數字時,它也會替換的兩個數字字符串的一部分。例如,如果原始字符串是:替換字符串中的整個值

id not in (2, 3, 4) and id > 22 

當我執行搜索和替換2,無論是數字222被替換。

用正則表達式我可以找到2,但是當我替換它(正則表達式基本上查找我想要的數字和一些可能的分隔符,如空間,()等)。是否有可能取代這個號碼,但保留這些分隔符?

這是我現在有:

Regex.Replace(returnValue 
       , String.Format("[,()]{0}[,()]", number) 
       , replaceValue) 
+0

我不得不問,你爲什麼要這麼做? –

+0

我需要保存一個表達式,稍後我將使用它來過濾數據,並且我需要能夠以儘可能友好的方式將其顯示給用戶。 – Rudonja

回答

0

模式由I4V建議看起來簡單和偉大的我,但你也可以嘗試這種模式:

(\d+)(?=[,\)]) 

這種模式背後的理念是,有時我們不得不號碼column namesAddress1Address2因此使用它可以匹配他們。這種模式不會允許這些情況。

希望它會幫助!

EDIT

List<int> replacements = new List<int>(new int[] { 5 , 6 , 7}); 
string input = "id not in (2, 3, 4) and id > 22"; 

foreach(int element in replacements) 
    input = Regex.Replace(input,@"(\d+)(?=[,\)])",element.ToString()); 

這裏:

ID 2將由5取代,3將由6被替換和4將由7.所以finall字串取代將如下所示:

id not in (5, 6, 7) and id > 22 
+0

@Rudonja之前和之後,檢查我的更新。 – NeverHopeless

+0

這有幫助,我調整了我的代碼和得到解析的表達式,所以我能夠使用更容易的解析和這些例子我做了一些工作(到目前爲止) – Rudonja

2

像這樣的事情?

string input = "id not in (2, 3, 4) and id > 22"; 
var newstr = Regex.Replace(input, @"\d+", m => GetUserName(m.Value)); 


string GetUserName(string s) 
{ 
    return ">>" + s + "<<"; 
} 
+0

它不會像這樣工作,因爲它將取代22以及... – Bidou

+0

@Bidou你可以在'GetUserName'中做任何你想做的事情。甚至返回原始字符串。 'GetUserName'不一定是一行代碼。 – I4V

+0

我的意思是你的正則表達式匹配數字22,這不是OP想要的(如果我理解了這個問題) – Bidou

0

改變你的正則表達式用戶向前看,向後看 - 讓你的模式如下

"(?<=[^0-9]){0}(?=[^0-9])" 

或者,如果你喜歡你的代碼示例

Regex.Replace(returnValue 
    , String.Format("(?<=[^0-9]){0}(?=[^0-9])", number) 
    , replaceValue) 

所以我們說:

(?<=[^0-9])看看我們匹配的項目後面,並確保它不是一個整數

{0}匹配的項目比我們的匹配項的

(?=[^0-9])的外觀,並確保它不是一個整數

0

您需要使用負lookarounds作爲解釋在這裏:Regular expression for 10 digit number without any special characters

對於示例:

const string input = "id not in (2, 3, 4) and id > 22"; 
string result = Regex.Replace(input, @"(?<!\d)(\d{1})(?!\d)", @"--$1--"); 

而結果:

「ID不在(--2--,--3--,--4--)和id> 22」

+0

時檢測到前面的字符和後面的字符。您是否檢查過它:'id not in(25,26,27)and id> 237' – NeverHopeless

+0

似乎我誤解了這個問題。我認爲目標是隻匹配包含一位數字的數字。問題中的例子(與2和22)誤導我... – Bidou

+0

的目標是匹配確切的數字,而不是包含它的數字,所以22和2222會造成同樣的問題。我的想法是正則表達式,匹配我想要的數字,並檢查一個非數字字符在 – Rudonja