2014-03-05 58 views
1

我是相當正規的新手,但我有一系列類似的字符串"[$myVar.myVar_STATE]"我需要替換第二個myVar,以句點開頭並以下劃線結尾。我需要它完全匹配它,因爲有時我會有"[$myVar.myVar_moreMyVar_STATE]",在這種情況下,我不想替換任何東西。正則表達式匹配以句點開頭並以下劃線結尾的單詞嗎?

我試過類似"\b.myVar_\b", "\.\bmyVar_\b"等幾個,都沒有運氣。

+0

假設您的意思是下劃線而不是分號;第二個示例仍符合列出的標準,是什麼豁免?在結束之前的下一個下劃線] –

+0

是的,在結束括號之前有一個下一個下劃線]使它成爲我不想要的字符串 – Smoore

回答

1

如何:

\[\$myVar\.([^_]+)_STATE\] 

匹配:

[$myVar.myVar_STATE]   // matches and captures 'myvar' 
[$myVar.myVar_moreMyVar_STATE] // no match 

工作正則表達式的例子:

http://regex101.com/r/yM9jQ3

或者,如果_STATE是可變的,你可以使用這個(如只要STATE部分中的文本沒有在它強調。)

\[\$myVar\.([^_]+)_[^_]+\] 

工作正則表達式的例子:

http://regex101.com/r/kW8oE1

編輯:符合以下OP的評論,這應該是他想創造:

(\[\$myVar\.)([^_]+)(_[^_]+\]) 

正則表達式替換例如:

http://regex101.com/r/pU6yL8

C#

var pattern = @"(\[\$myVar\.)([^_]+)(_[^_]+\])"; 
var replaced = Regex.Replace(input, pattern, "$1"+ newVar + "$3") 
+0

是否有這樣的版本,如果它不明確「STATE」?在我的示例字符串中有各種不同的單詞可以代替「STATE」。 – Smoore

+0

@Smoore,是的,這應該起作用:'\ [\ $ myVar \。([^ _] +)_ [^ _] + \]' - http://regex101.com/r/yW8xH5 – MElliott

+0

@Smoore,我明白了,我編輯了我的答案,去做你正在尋找的東西。:) – MElliott

1

這應做到:

\[\$myVar\.(.*?)_STATE\] 

你可以使用這個小竅門挑選出團,並在年底建成更換,就像這樣:

var replacement = "something"; 
var input = @"[$myVar.myVar_STATE]"; 
var pattern = @"(\[\$myVar\.)(.*?)_(.*?)]"; 
var replaced = Regex.Replace(input, pattern, "$1"+ replacement + "_$2]") 
1

什麼像:

*(myVar的_)*

這看起來什麼,然後a。和「myVar_」後面跟着任何東西。

它匹配:

「[$ myVar.myVar_STATE]」

而且只有第一myVar_這裏:

「[$ myVar.myVar_moremyVar_STATE]」

See it in action

1

C#已經有內建的方法來做到這一點

string text = ".asda_"; 
    Response.Write((text.StartsWith(".") && text.EndsWith("_"))); 
+0

如何在用「_STATE」或句子中的某個內容替換「myVar」之類的內容?例如「這是一個句子中的[$ myVar.myVar_SOMETHING」]的例子。「 – Smoore

+0

問題要求以'_'結尾的東西..你能給我一些有效的字符串例子嗎? –

1

是正則表達式真正需要的?

string input = "[$myVar.myVar_STATE]"; 
string oldVar = "myVar"; 
string newVar = "myNewVar"; 
string result = input.Replace("." + oldVar + "_STATE]", "." + newVar + "_STATE]"); 

如果"STATE"是一個可變部分,那麼我們需要使用正則表達式。最簡單的方法是使用匹配前綴和後綴之間位置的正則表達式模式。前綴和後綴用於搜索,但不包含在最終的比賽:

(?<=prefix)find(?=suffix) 
result = 
    Regex.Replace(input, @"(?<=\.)" + Regex.Escape(oldVar) + "(?=_[A-Z]+])", newVar); 

說明:

prefix部分爲\.,這代表"."

find部分是被替換的轉義舊變量。正則表達式轉義可以確保在正則表達式中具有特殊含義的字符能夠被轉義。

suffix部分是_[A-Z]+],下劃線後面跟着至少一個字母后跟"]"。注意:第二個]不需要轉義。開頭的括號[必須像這樣逃脫:\[。我們不能使用\w作爲STATE部分的單詞字符,因爲\w包含下劃線。您可能需要修改[A-Z]部分以完全匹配所有可能的狀態(例如,如果狀態有數字,則使用[A-Z0-9]

+0

我可以像「myVar」和「myVar_different」這樣的字符串,只想替換第一個「myVar」,而不是「myVar_different」。 – Smoore

+0

沒問題,在查找/替換中包含'_STATE]「部分。 –

相關問題