3

我正在尝试根据 C# 中的属性属性过滤掉一些对象。我决定基于比较两个逗号分隔的列表来执行此操作,例如:

  • "a,b,c" ~ "a,b,c", "a,c,b", "c,a,b" 等等。
  • "a,b,*" ~ "a,b,c", "a,d,b", "g,a,b", "a,b" 等等。
  • "a,b,c" !~ "a,c,d", "a,c", "a", 等等..

我认为您应该能够使用简单的正则表达式匹配表达式来做到这一点,但我还无法弄清楚。

有人知道怎么做吗?同时,要用代码暴力破解它。

提前致谢

- 编辑

通过〜我的意思是等效的,很抱歉造成混淆。

“a,b,c”也可以是“abra,barby,candybar”。它不是单个字符,而是一个值列表。

4

3 回答 3

4

它不是一个正则表达式,但它比任何一个都简单得​​多。

var attributes = input.Split(",");
var testCase = test.Split(",");

return attributes.All(x => testCase.Contains(x)) && testCase.All(x => attributes.Contains(x);

&&如果找到 *,请省略表达式的一半。

于 2012-10-24T18:15:08.073 回答
2

如果你想要一个正则表达式,这是我对此的看法:

^                       # match start of string
 (?=.*a(?:,|$))         # assert it matches a followed by a comma or end-of-str
 (?=.*b(?:,|$))         # assert it matches b followed by a comma or end-of-str
 (?=.*c(?:,|$))         # assert it matches c followed by a comma or end-of-str
 (?:(?:a|b|c)(?:,|$))*  # match a, b or c followed by a comma or end-of-str
$                       # match end of string

如果您找到 a .*,则保留断言,但更改正则表达式的最后一部分以使其匹配任何内容。第二个例子

^                       # match start of string
 (?=.*a(?:,|$))         # assert it matches a followed by a comma or end-of-str
 (?=.*b(?:,|$))         # assert it matches b followed by a comma or end-of-str
 (?:[^,]*(,|$))*        # match anything followed by a comma or end-of-str
$                       # match end of string

当然,您仍然需要解析字符串以生成正则表达式,在这一点上,坦率地说,我更愿意只使用常规代码(它可能也会更快),例如(伪代码):

setRequired  = Set(csvRequired.Split(','))
setActual    = Set(input.Split(','))

if (setActual.Equals(setRequired)))
{
    // passed
}

如果您找到星号,只需将其删除setRequired并使用.Contains而不是Equals

于 2012-10-24T18:10:03.690 回答
-2

尝试 ((a|b|c)(,|))+

其中 a、b 和 c 是列表中的每个选项。这是我在正则表达式中的快速测试的永久链接。如果您查看最后一个测试“a,x,b”,正则表达式匹配两个单独的部分,但我认为它仍然可以在 C# 中使用 Regex.Match()

于 2012-10-24T17:49:32.890 回答