找到字符串的出现并将其存储在数组中

时间:2015-04-23 16:16:16

标签: c# regex

我有一个字符串格式的svg文件,看起来像这样http://jsfiddle.net/mumg81qq/5/这个文件包含十六进制/ rgb格式的颜色代码。

我想在两个数组中提取这两种不同类型的颜色格式。

十六进制颜色可以是

的格式
fill:#303744 
---OR---
fill="#020202"

和rgb颜色可以是

的格式
fill:rgb(48,49,55)
---OR---
fill="rgb(205,149,36)"

结果数组应该如下所示

hexColor = ["#303744","#020202"]

rgbColor = ["rgb(48,49,55)","rgb(205,149,36)"]

我只能设法编写搜索一种十六进制字符串的代码。

string searchHex1 = "fill=\"#", searchHex2 = "fill:#";
string searchRGB1 = "fill=\"rgb(", searchRGB2 = "fill:rgb(";

List<string> hexColor = new List<string>();
List<string> rgbColor = new List<string>();

string sHexColor = "";
int index = 0;
do
{
    index = svgFile.IndexOf(searchHex1, index);
    if (index != -1)
    {
        sHexColor = svgFile.Substring(index, 7);
        if (!hexColor.Contains(sHexColor))
        {
            hexColor.Add(sHexColor);
        }
        index++;
    }
} while (index != -1);

以最有效的方式我想搜索4种不同类型的十六进制和rgb颜色并将其存储在两个不同的数组中。

3 个答案:

答案 0 :(得分:1)

这样的事情应该适合你,input是你的文件作为字符串

        string hexapattern = @"#[0-9a-fA-F]{6}";
        string rgbpattern = @"rgb\([0-9]+\,[0-9]+\,[0-9]+\)";

        Regex rgxHexa = new Regex(hexapattern);
        MatchCollection matches = rgxHexa.Matches(input);
        foreach (Match match in matches)
        { 
            // add to hexa array
        }


        Regex rgxRGB = new Regex(hexapattern);
        matches = rgxRGB.Matches(input);
        foreach (Match match in matches)
        {
            // add to rgb array
        }

并且不要忘记using System.Text.RegularExpressions;

答案 1 :(得分:1)

会是这样的......

string hexRegex = @"fill[:=]""?(#[a-fA-F0-9]{6})""?";
string rgbRegex = @"fill[:=]""?(rgb\( *\d{1,3} *, *?\d{1,3} *, *\d{1,3} *\))""?";
string oneRegex = string.Format("({0}|{1})", hexRegex, rgbRegex);

string testdata = @"fill:#303744" + 
                  @"fill=""#020202""" +
                  @"fill:rgb(48,49,55)" +
                  @"fill=""rgb(205,149,36)""";

IEnumerable<string> colorCodes = Regex.Matches(testdata, oneRegex)
                                      .Cast<Match>()
                                      .Select(match => match.Groups[1].Value.Replace(" ",""));

Result

答案 2 :(得分:0)

这是单线版:

var hexMatches = Regex.Matches(svg, @"(?<=fill:|="")#[0-9a-fA-F]{6}")
    .Cast<Match>().Select (m => m.Value).ToList();
var rgbMatches = Regex.Matches(svg, @"(?<=fill:|="")rgb\((\d{1,3},?){3}\)")
    .Cast<Match>().Select (m => m.Value).ToList();

您会注意到使用积极的外观&#39>:

(?<=fill:|="")

它们完全是可选的,只是在那里,所以如果引入了不是填充的其他颜色值,您就不会得到不需要的匹配。我不太了解文件的来源,所以我会留给你保留或不保留。