正则表达式,用于消除任意括号和包含逗号分隔参数的可选尾随括号构造之间的歧义

时间:2011-12-06 12:11:02

标签: .net regex

我在写一个正则表达式时遇到麻烦,我很想修改正则表达式语法的所有语言元素,但遗憾的是我在这个特定的工作项目上已经没时间了所以我不得不服从那里更大的正规表达大师:)

平台

这是使用.NET正则表达式引擎运行的。到目前为止,我已经使用Expresso来创建模式。

到目前为止的模式

^
(?<BaseTable>
    (?# The quantifier here is simply too greedy, I thought just a lazy 
        modifier '?' would be appropriate?)
    (?# But instead I had to coax it along with a positive look ahead 
        assertion??? The lazy '*?' on it's own confused Expresso?)
    .*?(?=\([^(]+\)$|$)                     
)
(?# Handle a leading comma if there are comma delimited arguments)
(\(\s*(\s*,?\s*                             
    (?# All these arguments are optional but at least one of them has to 
        exist to qualify the trailing parenthesis as the arguments)
    (C\s*=\s*(?<CalenderYear>\d{4})
    |B\s*=\s*(?<YearOfBirth>\d{4})
    |S\s*=\s*(?<Scale>[\d.]+)\s*%?\s*
    |P\s*=\s*(?<Projection>[^,]+)
    |U\s*=\s*(?<Underpin>[\d.]+)\s*%?\s*))*
(?# This zero or one quantifier needs to be greedier than the BaseTable 
    quantifier)
\))?  

测试用例

PA(90)M(S=125.00 %,B=2011)
PA(90)M(S=125.00 %)
PA(90)M
PA(90)M(S=125.00 %,B=2011)
table(arbitrarytableparenthesis)(p=arguments,s=125.00%)
BaseTable(TableDetail)(B=2011,P=ProjectionArguments,S=115.00%,U=5.00%)
BaseTable(TableDetail)( B = 2011 , P = ProjectionArguments , S = 115.00 %, U = 5.00 %)
Base Table(with spaces)( B = 2011 , P = ProjectionArguments , S = 115.00 %, U = 5.00 %)
Only(ASuccessfulMatch)(S=125.00 %,P = CMI_2009_F [1.25%] + 1.25%)
Only(APartialMatch)

问题

除了最后一个之外,以上所有产生了良好的匹配。我需要将完整的最后一个案例Only(APartialMatch)全部包含在命名的捕获组BaseTable中。

Only(APartialMatch)需要针对上一场比赛Only(ASuccessfulMatch)消除歧义。

任何帮助非常感谢!干杯!

更新

jsobo善意地提供了一个修正的正则表达式模式,其推动了解决方案。它只在括号的尾随集合之前考虑了一对任意括号 - 最终是我如何构建查询的一个缺陷(许多道歉)。我希望对模式有一个修正,明确消除含有参数的尾对括号和BaseTable子捕获中可能存在的任何其他括号之间的歧义。

因此,一些更新的测试用例将是:

Base Table(with spaces)Table Stuff(More Table Stuff)( B = 2011 , P = ProjectionArguments , S = 115.00 %, U = 5.00 %)
Base Table(with spaces)Table Stuff(More Table Stuff)Other table stuff(still more table stuff)( B = 2011 , P = ProjectionArguments , S = 115.00 %, U = 5.00 %)
Base Table(with spaces)Table Stuff(More Table Stuff)Other table stuff(still more table stuff)final base table stuff( B = 2011 , P = ProjectionArguments , S = 115.00 %, U = 5.00 %)

1 个答案:

答案 0 :(得分:1)

我在第一组中摆脱了你的前方,只是改变它来寻找你的模式

什么......(任何东西)在下一个paren之前可选择更多东西...

^(?<BaseTable>.*?\(.*?\)[^(]*)(\(\s*(\s*,?\s*(C\s*=\s*(?<CalenderYear>\d{4})|B\s*=\s*(?<YearOfBirth>\d{4})|S\s*=\s*(?<Scale>[\d.]+)\s*%?\s*|P\s*=\s*(?<Projection>[^,]+)|U\s*=\s*(?<Underpin>[\d.]+)\s*%?\s*))*\))?

所以

^(?<BaseTable>.*?(?=\([^(]+\)$|$)))

成了

^(?<BaseTable>.*?\(.*?\)[^(]*)