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

标签 c# regex

我对正则表达式一无所知,所以我请求这个伟大的社区帮助我。 在 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匹配两个子模式之一:
    • && - 一个 &&子串
    • | - 或者
    • \|\| - 一个 ||子串。

enter image description here

C#代码:

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

关于c# 正则表达式匹配排除第一个和最后一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930448/

相关文章:

c# - IPC 使用 Protobuf 和内存映射文件 C#

c# - 机器启动时运行exe

c# - NavigationService 删除 forwardstack

java - 如何提取单行源代码注释之间的文本?

regex - 可以将特定数字添加到一堆 "time"字符串中,在正则表达式中完成

c# - 如何更快地在 Visual Studio 中编写代码?

c# - 服务器通知客户端它已初始化的最佳方式

mysql - 使用 REGEXP (MySql) 在单词边界内查询以字符串开头/结尾的记录

regex - 使用 RewriteCond %{QUERY_STRING} 而不将查询字符串附加到新地址

Java RegEx 日期验证 - 闰年