【问题标题】:Regex capture value within bracket, value contain brackets as well正则表达式捕获括号内的值,值也包含括号
【发布时间】:2013-06-17 17:36:09
【问题描述】:

我要匹配以下文字:

(valuex) AnySingleWord (valuey)

我想在括号内捕获 valuex,valuey 的文本。困难的是 valuex,valuey 都可以包含括号。例如

((value1) AnySingleWord (value2)) AnySingleWord ((value3) AnySingleWord (value4))

那么我的valuex应该是

(value1) AnySingleWord (value2) 

valuey 应该是

(value3) AnySingleWord (value4)

正则表达式可以做一些事情,比如计算左括号已经过去的数量,然后匹配直到找到右右括号吗?非常感谢。

PS:我可以将开/关括号对的数量限制为 2-3,如果这足够小,可以通过正则表达式解决

【问题讨论】:

  • 嵌套括号的数量是否有上限?如果是这样,那么您可以使用正则表达式。但是,这可能不是最简单的解决方案。
  • @Jerry:你仍然可以递归地得到它。
  • 我可以将开/关括号对的数量限制为 2-3,如果这小到可以通过正则表达式解决
  • 标题更改请求。 '括号'这个词不应该用于'['而不是'('(括号)吗?

标签: c# regex pattern-matching brackets curly-braces


【解决方案1】:

如果我理解正确的话,一个非常简单的方法如下:

1. iterate through characters
2. find first left brace
3. count braces until non-paired right brace appears and store index
4. take the substring from zero to that index and set as value x
5. delete value x substring
6. go to step 1 and store next part as value y

【讨论】:

  • 这将是一个直观的非正则表达式解决方案,如果我无法使用正则表达式处理,我会试试这个
  • 当然!它也会更容易阅读和调试。这是您的选择,但这种情况似乎很适合非正则表达式解决方案。
【解决方案2】:

是的,你可以使用这个模式:

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

更多关于这种模式的信息在这里:

http://blogs.msdn.com/b/bclteam/archive/2005/03/15/396452.aspx

【讨论】:

  • 这行得通,非常感谢。太好了,因为这是我个人的工作,否则队友会谋杀我,或者我会沮丧地解释正则表达式平衡匹配组。
【解决方案3】:

你的正则表达式是

(?<left>\(([^()]*(\([^()]*\))?[^()]*)+\))[^()]*(?<right>\([^()]*((\([^()]*\))?[^()]*)+\))

你的代码是

Match m=Regex.Match(inp,reg);
m.Groups["left"].Value;//left value
m.Groups["right"].Value;//rightvalue

【讨论】:

  • 谢谢,遗憾的是卡西米尔的解决方案更短,再次感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2015-01-20
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多