C#Regex-以pattern1开头,不包含pattern2

C#Regex-以pattern1开头,不包含pattern2,c#,regex,C#,Regex,对于以下内容,输入字符串包含所有这些内容: a1.aaa[认购] a1.bbb a1.ccc b1.ddd d1.ddd[认购] 我想得到输出: bbb ccc 这意味着:在“a1”之后的所有单词,不包含子字符串“[SUBSCRIBED]” 所有单词都在“a1”之后,不包含子字符串 “[订阅]” 为什么是正则表达式?以下是非常清楚的: var result = strings .Where(s => s.StartsWith("a1.") && !s.Con

对于以下内容,输入字符串包含所有这些内容:

  • a1.aaa[认购]
  • a1.bbb
  • a1.ccc
  • b1.ddd
  • d1.ddd[认购]
我想得到输出:

  • bbb
  • ccc
这意味着:在“a1”之后的所有单词,不包含子字符串“[SUBSCRIBED]”

所有单词都在“a1”之后,不包含子字符串 “[订阅]”

为什么是正则表达式?以下是非常清楚的:

var result = strings
    .Where(s => s.StartsWith("a1.") && !s.Contains("[SUBSCRIBED]"))
    .Select(s => s.Substring(3));

蒂姆的回答有道理。然而,如果你坚持的话,我敢说正则表达式看起来是这样的

^a1\.(.*)(?<!\[SUBSCRIBED\])$
^a1\.(.*)(?
带
^a1
表示以a1开头
\.(.*)
使用任意数量的字符
负查找
(?将拒绝以[SUBSCRIBED]结尾的文本

^a1\.(?!.*\[SUBSCRIBED])(.*)

详细信息

  • ^
    -字符串的开头
  • a1\.
    -文本
    a1.
    子字符串
  • (?!.\[SUBSCRIBED])
    -如果在任何0+字符后出现
    [SUBSCRIBED]
    子字符串,则会导致匹配失败的负前瞻(如果未使用
    RegexOptions.Singleline
    选项,则换行符除外)
  • (.*)
    -第1组:行的剩余部分,直到最后(如果使用
    RegexOptions.Singleline
    选项,
    也将匹配换行符)
C#代码:


我肯定我以前见过这个问题……你尝试过什么?请发表一篇欢迎StackOverflow的文章,请花一点时间回顾一下教程:,如何创建一个最小的、完整的、可验证的示例:,更具体地说,如何提出好的问题-如果你对你的问题进行思考,你会得到更好的反馈和有用的答案在你来寻求帮助之前,你要用一个特定的问题来解决问题,你自己努力解决问题。一旦你有了具体的问题,你就可以编辑你的帖子。这将是“a1”的长度。(它将是一个变量)@bensagi1989:regex效率不高,无论您使用变量还是
“a1”。
。使用
s.StartsWith(variable)
s.Substring(variable.length)
因为OP说
a1
将是可变长度的,而且因为他们似乎不接受
b1.ddd
->
ddd
,所以regex将不起作用,除非OP添加一个MCVE来显示
a1
变量是如何处理的。我假设在构建regex字符串时,应该在“a1”的位置注入变量像
expressions=$“^{variable}\(.*)(?)?
var result = string.Empty;
var m = Regex.Match(s, @"^a1\.(?!.*\[SUBSCRIBED])(.*)");
if (m.Success) 
{
    result = m.Groups[1].Value;
}