正确匹配后,正则表达式不会捕获该组

时间:2017-03-18 13:34:04

标签: c# regex

我有两个单独的字符串:

1. "@colorVariableOne: @color_white;"
2. "@colorVariableTwo: #008000;"

我使用以下正则表达式模式来测试字符串是否匹配:

string colorVariablePattern = @"(@[a-zA-Z0-9-_]+): (#[0-9a-fA-F]{3,})|.*(@color_[a-zA-Z0-9-_]+).*;";

模式成功匹配两个字符串,但没有正确填充第一个字符串的组:

enter image description here

enter image description here

更具体地说,它没有捕获第一个变量名组,这是我关心的那个?我错过了什么吗?

编辑:

我需要它匹配/不匹配以下所有字符串:

@ala-bala__portokala: fade(@color_k1, 40%); // MATCH
@ala-bala: rgb(255, 255, 255); // MATCH
@ala-bala: rgba(16, 16, 16, 0.2); // MATCH
@ala-bala__portokala: #cccccc; // MATCH
@ala-bala__portokala: 1px solid @color_w; // MATCH
@ala-bala__portokala: @color_r1; // MATCH
@ala-b: @colozr_p; // NOT MATCH
@ala-b: 2px; // NOT MATCH

编辑2:

所以,经过一些改动之后,这是正确匹配所有内容的最终正则表达式:

(@[a-zA-Z0-9-_]+): .*(?:(@color_[a-zA-Z0-9-_]+)|(#[0-9a-fA-F]{3,})|(rgb[a]?[(].*[)])).*;

1 个答案:

答案 0 :(得分:2)

源字符串中的第1个不包含#...部分, 因此第一个变体将不匹配。

因此正则表达式处理器尝试第二个变体(" |"之后), 其中包含仅一个捕获组,匹配 @color_white

可能你的意图是:

  • 首先找到与@colorVariable...:匹配的内容。
  • 然后找到与@<color_name>#<numbers>匹配的匹配项。

将正则表达式更改为:

(@[a-zA-Z0-9-_]+): (?:(#[0-9a-fA-F]{3,})|(@color_[a-zA-Z0-9-_]+));

请注意,现在它包含:

  • 首先捕获与@colorVariable...匹配的组。
  • 冒号和空间
  • 非捕获组,有2个变体(捕获组2和3) 对于这个组中的颜色规范
  • 终止;