2016-12-02 90 views
1

我想用正則表達式來定位字符串中的BELL字符對。用於識別重複字符的正則表達式

我的問題是,用我目前的解決方案,我會 - 如果我有6個貝爾字符,接連找到1和2,3和4,5和6之間的匹配,但我也需要找到2和3是一個對和4和5.我已經從regex.com製作了一張圖片,這可能會讓我很明白我的挑戰是什麼。

我意識到我可以爲每個Bell分割字符串,並循環遍歷結果並檢查每個空實例,但由於我將處理相當大的文件,因此我認爲正則表達式可能更有效。

picture from regex showing match in current code

的目的是能夠用別的東西來代替空值。我不能在這個表單字段中寫入BELL,但在下面的示例中,我使用.來表示BELL。輸入可能是.0......2.,我想使.0.999.999.999.999.999.2.,但目前我得到0..999..999..999.2.

的代碼是這樣的:

var lines = File.ReadAllLines(dir + "Temp5\\" + filname + ".csv"); 
using (var sw = new StreamWriter(dir + "Final\\" + filname + ".csv")) 
{ 
    foreach (string line in lines) 
    { 
     cleanline = Regex.Replace(line, @"", "999"); 
     sw.WriteLine(line2); 
    } 
} 
+1

對不起,圖片沒有幫助。語言是什麼?文本輸入測試?預期結果? –

+0

我使用的是c#,目的是爲了能夠用其他的替換空值。我不能在這個表單字段中寫入BELL,但是在我使用的下面的示例中。代表貝爾 輸入可能是.0 ...... 2。我想提出.0.999.999.999.999.999.2。但目前我得到0..999..999..999.2。 – Bispen

+0

然後請分享代碼。 –

回答

0

你需要與像"(?<!\a)\a{6}(?!\a)"正則表達式匹配6個鈴塊,然後插入999在匹配評估器中的每個char之間。

詳細

  • (?<!\a) - (負回顧後)必須沒有鍾炭的當前位置之前
  • \a{6} - 6鍾字符
  • (?!\a) - (負先行)有不得鍾焦炭當前位置後

看到一個demo(但使用了更好的可視性點):每個鍾字符後跟帶鈴字符後

using System; 
using System.Linq; 
using System.Text.RegularExpressions; 
public class Test 
{ 
    public static void Main() 
    { 
     var line = " .2 1..2 .0......2."; 
     Console.WriteLine(Regex.Replace(line, "(?<!\\.)\\.{6}(?!\\.)", 
      m => string.Join("999", m.Value.Select(Char.ToString)))); 
    } 
} 

只需添加999,使用

cleanline = Regex.Replace(line, "\a(?=\a)", "$&999") 
+0

我不知道會有多少對鍾,它可能是連續的3個鐘形字符,或者6或..我需要每次找到兩個鐘形字符後面的每一個 – Bispen

+0

然後,你是否嘗試過'Regex.Replace(line,「\ a(?= \ a)」,「$&999」)?我之前發佈了它作爲評論,但沒有反饋。 –

1

你可以用積極的外觀背後,使其工作:

(?<=・)・ 

https://regex101.com/r/tSJLZF/1

正回顧後(?< =·)

斷言,正則表達式如下匹配 ·匹配的字符·字面上(區分大小寫) ·相匹配的字符·字面上(區分大小寫)

+0

感謝您的幫助。我可以看到,這給了我所有貝爾字符的2號,但我很天真,當涉及到正則表達式模式,能夠把它變成一些東西,使我能夠找到BELL的空間 – Bispen

+0

@Bispen:對不起我不' t得到你的意思是:( –

0

如果有鈴數不詳輸入字符串中的字符,並且您想要在相鄰的響鈴字符之間插入一個999,那麼簡單的方法就是使用string.Replace方法。

以下代碼使用分號(即;)而不是鈴鐺字符。需要的Replace

char bellCharacter = ';'; 
string twoAdjacentBells = new string(bellCharacter, 2); 
string twoBellsWith999 = bellCharacter + "999" + bellCharacter; 
string inputLine = "abc;;def;;;;ghi"; 
string outputLine = inputLine 
    .Replace(twoAdjacentBells, twoBellsWith999) 
    .Replace(twoAdjacentBells, twoBellsWith999); 

兩個呼叫正確處理的三個相鄰鍾字符的情況。

另一種方法是在響鈴字符上分割輸入字符串,掃描字符串的結果列表,用999替換空字符串,然後重新組裝這些棋子。代碼會是這樣的:

string oneBell = new string(bellCharacter, 1); 
string[] pieces = inputLine.Split(bellCharacter); 
for (int ii=0; ii<pieces.Count(); ii++) 
{ 
    if (string.IsNullOrEmpty(pieces[ii])) 
    { 
     pieces[ii] = "999"; 
    } 
} 
string anotherOutputLine = string.Join(oneBell, pieces);