2010-07-20 38 views
0

我试图从Sysdba.之后得到一个字符串。这里有一个例子我的结果将是PRODUCTION使用正则表达式的帮助

CAST(CASE WHEN SYSDBA.PRODUCTION.SHIPPING_COMPLETE_DATE IS NOT NULL THEN 1 ELSE 0 END AS bit) AS [Shiping Completed]] 

我创建的正则表达式

Regex CatagoryRegex = new Regex(@"SYSDBA\.(.#)\.", RegexOptions.IgnoreCase | RegexOptions.Compiled); 

但是当我打电话var tmp = CatagoryRegex.Match(SelectText);我没有得到任何比赛。我知道我很可能犯了一个简单的错误,但我无法发现它。

+0

我没有看到“PREPRODUCTION”字符串中的任何地方解析。你的意思是“制作”吗? – Pretzel 2010-07-20 19:04:36

+0

更正的例子 – 2010-07-20 19:12:10

回答

2

您的特定问题是.#将匹配“任何字符”,然后是#字符。

最简单的修复方法可能是使用.+,但对于您看来正在做的事情来说,这有点粗糙。更好的步骤是不贪婪.+?这只会捕捉高达下一.(除非它有可能进一步走),但我可能会更进一步甚至比这...

为了防止.捕获的内基,尝试此表达式:

"SYSDBA\.([^.]+)\." 

[^.]是任意字符不是.(不需要在字符类逃逸),并且+手段“一个或多个”。

如果你想可能允许.捕获的组里面,你可以使用:

"SYSDBA\.(\S+)\." 

\S是任何非空白字符(所以停止匹配,如果空格或换行符)。

+0

我撤回了我的答案。我认为这是迄今为止最好的答案。 +1 – Pretzel 2010-07-20 19:07:21

+0

我thouht#是非贪婪版本的* insted的+?那是我愚蠢的错误。 – 2010-07-20 19:11:00

+0

感谢椒盐脆饼。我几乎完成了'\ w'路由,但是我不太了解可能被接受/需要匹配的内容(例如,如果这是TSQL,那么可能涉及''''和']')。无论如何,我已经进一步更新了一点 - 它仍然不够完整/彻底,但现在我必须走了 - 如果有人想再增加一点点评论,请随时发表评论。 – 2010-07-20 19:12:30

0

您可能的意思是.*而不是.#

+0

。*会过于贪婪,并吞噬一切......好吧,一切都到了下一个逃脱时期。 – Pretzel 2010-07-20 19:08:13