C# 字符串中的Regex访问元素

C# 字符串中的Regex访问元素,c#,arrays,regex,C#,Arrays,Regex,我有以下正则表达式代码: @"(N[0-9][EHPULMAVRYGBWK123670]{4}[N]{1}PF[0]{1}[0-9]{1})"; 正则表达式中的[EHPULMAVRYGBWK123670]表示特定的按钮类型或颜色 总共有四个按钮,它们在零件号中的顺序表示它们在产品中的顺序(从左上到右上) 例如,如果零件号包含: RGBY-红色(左上)、绿色(右上)、蓝色(左下)、黄色(右下) GBYR-绿色(左上)、蓝色(右上)、黄色(左下)、红色(右下) 按钮后面总是有字母N和PF编号。 我

我有以下正则表达式代码:

@"(N[0-9][EHPULMAVRYGBWK123670]{4}[N]{1}PF[0]{1}[0-9]{1})";
正则表达式中的[EHPULMAVRYGBWK123670]表示特定的按钮类型或颜色

总共有四个按钮,它们在零件号中的顺序表示它们在产品中的顺序(从左上到右上)

例如,如果零件号包含:

RGBY-红色(左上)、绿色(右上)、蓝色(左下)、黄色(右下)

GBYR-绿色(左上)、蓝色(右上)、黄色(左下)、红色(右下)

按钮后面总是有字母N和PF编号。

我想做的是提取颜色的4个字母组合。正则表达式中的
{4}
就是捕获这些字母的。然后我需要根据信件的顺序做出决定


我该怎么做呢?

您需要稍微修改您的正则表达式,以便它能够捕获所讨论的四个字母。然后,您可以决定如何处理它们:

var pattern = @"(N[0-9]([EHPULMAVRYGBWK123670]{4})[N]{1}PF[0]{1}[0-9]{1})";
var test = "NO4A6SRP11N2UBWYNPF05";
var regex = new Regex(pattern, RegexOptions.IgnoreCase);
var result = regex.Match(test);
if(result.Success)
{
    var value = result.Groups[2].Value;
    switch (value)
    {
        case "UBWY":
            //Do something
            break;
        case "RBYG":
            //Do something
            break;
        default:
            break;
    }
}
请注意与四个字母匹配的图案周围的括号

有更优雅的方法来决定如何使用四个字母的代码。在本例中,为了便于说明,我提供了一个简单的
开关
语句

或者,您可以逐个字母检查捕获的字符串:

//Character by character, in order
for (int i = 0; i < value.Length; i++)
{
    char letter = value[i];
    //Decide what to do here. 
}


//Or check positions by index
if(value[0] == 'U')
{
    //Decide what to do here.
}
//按顺序逐个字符
for(int i=0;i

取决于有多少组合是可能的,您可能需要考虑使用.< /p> ,您需要稍微修改正则表达式,以便捕获所讨论的四个字母。然后,您可以决定如何处理它们:

var pattern = @"(N[0-9]([EHPULMAVRYGBWK123670]{4})[N]{1}PF[0]{1}[0-9]{1})";
var test = "NO4A6SRP11N2UBWYNPF05";
var regex = new Regex(pattern, RegexOptions.IgnoreCase);
var result = regex.Match(test);
if(result.Success)
{
    var value = result.Groups[2].Value;
    switch (value)
    {
        case "UBWY":
            //Do something
            break;
        case "RBYG":
            //Do something
            break;
        default:
            break;
    }
}
请注意与四个字母匹配的图案周围的括号

有更优雅的方法来决定如何使用四个字母的代码。在本例中,为了便于说明,我提供了一个简单的
开关
语句

或者,您可以逐个字母检查捕获的字符串:

//Character by character, in order
for (int i = 0; i < value.Length; i++)
{
    char letter = value[i];
    //Decide what to do here. 
}


//Or check positions by index
if(value[0] == 'U')
{
    //Decide what to do here.
}
//按顺序逐个字符
for(int i=0;i


取决于有多少个组合是可能的,你可能想考虑使用.< /p>什么是这个代码>保存在一个字符串< /代码>中的这个正则表达式?你能给出一个输入的例子吗?也许regex在这种情况下有点过分了,我想我理解他在做什么。正则表达式是提取颜色的4个字母组合所必需的。我相信正则表达式中的

{4}
就是捕获这些字母的原因。然后他需要根据字母的顺序做出决定。@JuanR是的,这正是我想要做的,抱歉我无法正确表达。一个小细节,但是
[N]{1}
也是
N
这是什么
将这个正则表达式保存在你正在谈论的字符串中?你能给出一个输入示例吗?也许regex在这种情况下有点过分了,我想我理解他在做什么。正则表达式是提取颜色的4个字母组合所必需的。我相信正则表达式中的
{4}
就是捕获这些字母的原因。然后他需要根据字母的顺序做出决定。@JuanR是的,这正是我想要做的,对不起,我无法正确表达。一个小细节,但是
[N]{1}
也是
N
拆分这4个字符不是更符合逻辑吗?这样你会得到大量的排列(
case
s)。@Stefan:正确。这就是为什么我在回答的末尾提到他可能会因为这个原因而想使用状态机的原因。:-)这太棒了,谢谢你!但是,我是否能够根据职位单独处理案例,而不是作为一个团队?在其他方面有太多的变化。当我早些时候说我想将正则表达式的结果保存到字符串中时,我可以使用字符串中字符的位置,然后使用基于该位置的case语句。例如,查看位置[1]处的字符-如果B->做某事,如果C->做某事。我该怎么做呢?另一个建议是命名您感兴趣的捕获组。例如:
(?[EHPULMAVRYGBWK123670]{4})
我发现这比使用索引更容易处理,因为索引很难读取,如果您决定需要添加更多组,那么很容易出错。您可以使用
result.Groups[“color”]检索命名组。Value
拆分这4个字符是否更符合逻辑?这样你会得到大量的排列(
case
s)。@Stefan:正确。这就是为什么我在回答的末尾提到他可能会因为这个原因而想使用状态机的原因。:-)这太棒了,谢谢你!但是,我是否能够根据职位单独处理案例,而不是作为一个团队?在其他方面有太多的变化。当我早些时候说我想将正则表达式的结果保存到字符串中时,我可以使用字符串中字符的位置,然后使用基于该位置的case语句。例如,查看位置[1]处的字符-如果B->做某事,如果C->做某事。我该怎么做呢?另一个建议是命名您感兴趣的捕获组。例如:
(?[EHPULMAVRYGBWK123670]{4})
我发现这比使用索引更容易处理,因为索引很难读取,如果您决定需要添加更多组,那么很容易出错。您可以使用
result.Groups[“color”]检索命名组。Value