正则表达式识别重复的字符

时间:2016-12-02 08:24:48

标签: c# regex

我正在尝试使用正则表达式来查找字符串中的BELL字符对。

我的问题是,根据我目前的解决方案,我会 - 如果我有6个贝尔字符接着找到1和2,3和4,5和6之间的匹配但我还需要找到2和3是一对我已经从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); 
    }
}

3 个答案:

答案 0 :(得分:1)

您可以使用积极的外观使其发挥作用:

{{1}}

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

正面观察(?< =·)

断言下面的正则表达式匹配 ·匹配字符·字面上(区分大小写) ·匹配字符·字面上(区分大小写)

答案 1 :(得分:0)

您需要将6个铃声块与"(?<!\a)\a{6}(?!\a)"等正则表达式匹配,然后在匹配评估器中的每个字符之间插入999

<强>详情:

  • (?<!\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")

答案 2 :(得分:0)

如果输入字符串中存在未知数量的铃声字符,并且您想在相邻的铃声字符之间插入999,那么一种简单的方法就是使用string.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);

需要两次调用Replace才能正确处理三个相邻的铃声字符。

另一种方法是将输入字符串拆分为贝尔字符,扫描结果字符串列表,用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);