Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.2k views
in Technique[技术] by (71.8m points)

正则表达式匹配花括号之间的字符串(允许通过“加倍”将其转义)

[这不是在单个花括号内提取值的重复问题。请阅读用户案例#3,答案未涵盖该案例]

我想知道是否可以定义一个满足以下用例的正则表达式

用例1

鉴于: 

Hola {name}

它应该匹配:name

但是我希望能够在需要时通过将花括号加倍来转义花括号,就像C#插入的字符串一样。所以,像这样的字符串

用例2

Hola {name}, this will be {{unmatched}}

{{无与伦比}} ,因为它使用它们的部分应该被忽略了一倍。请注意{{和}}。

用例3

在最后一个最复杂的情​​况下,这样的文本:

Buenos {{{dias}}}

文本dias应该匹配,因为第一个最外面的双花括号应该像另一个字符一样被解释(它们被转义),因此它应该匹配:{{{dias}}}

我的最终目标是稍后将匹配项替换为另一个字符串,例如变量。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

您可以使用

(?<!{)(?:{{)*({[^{}]*})(?:}})*(?!})

请参阅.NET regex演示

在C#中,您可以使用 

var results = Regex.Matches(text, @"(?<!{)(?:{{)*({[^{}]*})(?:}})*(?!})").Cast<Match>().Select(x => x.Groups[1].Value).ToList();

另外,要获得完全匹配,请将左和右上下文包含在环顾中:

(?<=(?<!{)(?:{{)*){[^{}]*}(?=(?:}})*(?!}))

请参阅此正则表达式演示。在C#中:

var results = Regex.Matches(text, @"(?<=(?<!{)(?:{{)*){[^{}]*}(?=(?:}})*(?!}))")
    .Cast<Match>()
    .Select(x => x.Value)
    .ToList();

正则表达式详细信息

  • (?<=(?<!{)(?:{{)*)-紧接在左侧,必须有零个或多个{{不立即以{char开头的子字符串。
  • {-一个{字符
  • [^{}]*-除{和以外的零个或多个字符}
  • }-一个}字符
  • (?=(?:}})*(?!}))-在右边,必须有零个或多}}个子字符串,且不能立即跟一个}字符。

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
by (71.8m points)
学习了......

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...