Skip to main content
 首页 » 编程设计

c# 正则表达式匹配排除第一个和最后一个字符

2024年01月29日28kenshinobiy

我对正则表达式一无所知,所以我请求这个伟大的社区帮助我。 在 SO 的帮助下,我设法编写了这个正则表达式:

    string input = "((isoCode=s)||(isoCode=a))&&(title=s)&&((ti=2)&&(t=2))||(t=2&&e>5)"; 
    string pattern = @"\((?>\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!))\)|&&|\|\|"; 
    MatchCollection matches = Regex.Matches(input, pattern); 
    foreach (Match match in matches) 
    { 
        Console.WriteLine(match.Groups[0].Value); 
    } 

结果是:

((isoCode=s)||(isoCode=a)) 
&& 
(title=s) 
&& 
((ti=2)&&(t=2)) 
|| 
(t=2&&e>5) 

但我需要这样的结果(没有第一个/最后一个“(”,“)”):

(isoCode=s)||(isoCode=a) 
&& 
title=s 
&& 
(ti=2)&&(t=2) 
|| 
t=2&&e>5 

可以吗?我知道我可以用子字符串(删除第一个和最后一个字符)来做到这一点,但我想知道它是否可以用正则表达式来完成。

请您参考如下方法:

你可以使用

\((?<R>(?>\((?<DEPTH>)|\)(?<-DEPTH>)|[^()]+)*(?(DEPTH)(?!)))\)|(?<R>&&|\|\|) 

参见 regex demo ,抓取组“R”值。

详情

  • \( - 一个开放的(
  • (?<R> - 开始 R命名组:
    • (?> - 原子组的开始:
      • \((?<DEPTH>)| - 一个开放的(并在 DEPTH 上推送一个空字符串组堆栈或
      • \)(?<-DEPTH>)| - 关闭 )并从 DEPTH 中弹出一个空字符串组堆栈或
      • [^()]+ - 除 ( 以外的 1 个以上字符和 )
    • )* - 零次或多次重复
    • (?(DEPTH)(?!)) - 一个条件结构,用于检查右括号和左括号的数量是否平衡
  • ) - R 结束命名组
  • \) - 关闭)
  • | - 或者
  • (?<R>&&|\|\|) - 组的另一个出现 R匹配两个子模式之一:
    • && - 一个 &&子串
    • | - 或者
    • \|\| - 一个 ||子串。

C#代码:

var pattern = @"\((?<R>(?>\((?<DEPTH>)|\)(?<-DEPTH>)|[^()]+)*(?(DEPTH)(?!)))\)|(?<R>&&|\|\|)"; 
var results = Regex.Match(input, pattern) 
    .Cast<Match>() 
    .Select(m => m.Groups[1].Value) 
    .ToList();