我对正则表达式一无所知,所以我请求这个伟大的社区帮助我。 在 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();
关于c# 正则表达式匹配排除第一个和最后一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930448/