【问题标题】:Help with a regex expression帮助正则表达式
【发布时间】:2010-07-20 19:00:50
【问题描述】:

我试图从字符串中取出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); 时,我没有得到任何匹配。我知道我很可能犯了一个简单的错误,但我无法发现它。

【问题讨论】:

  • 我在要解析的字符串中的任何位置都看不到“PREPRODUCTION”。您是说“生产”吗?

标签: c# regex capture-group


【解决方案1】:

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

最简单的解决方法可能是使用.+,但这对于您似乎正在做的事情来说有点粗糙。更好的是非贪婪的.+?,它只会捕获到下一个.(除非它必须更进一步),但我可能会比这更进一步......

要防止. 在捕获的组中,请尝试以下表达式:

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

其中[^.] 是不是. 的任何字符(无需在字符类中转义),+ 表示“一个或多个”。

如果您想在捕获的组中潜在地允许.,您可以使用:

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

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

【讨论】:

  • 我撤回了我的回答。我认为这是迄今为止最好的答案。 +1
  • 我认为 # 是非贪婪版本的 * insted of +?那是我的愚蠢错误。
  • 谢谢椒盐脆饼。我几乎确实走了\w 路线,但我对可能接受/需要匹配的内容知之甚少(例如,如果这是TSQL,则可能涉及[])。无论如何,我已经更新了一点 - 它仍然没有尽可能完整/彻底,但我现在必须去 - 如果有人想到任何要添加的内容,请随时发表评论。
  • Scott,我从来没有见过,虽然我不使用 .NET 正则表达式,所以这是可能的。但是,我知道任何正则表达式的 # 的唯一“特殊用途”是用于 cmets - 例如(?x)#endofline(?#inline).
  • 是的,\S 将与 \s 完全相反,\s 实际上是 [ \t\n\r](可能还有其他空白字符)。如果要排除下划线,可以使用(?!_)\S[^\s_] 来做到这一点。
【解决方案2】:

您可能指的是.*,而不是.#

【讨论】:

  • .* 会太贪婪,吞噬一切......好吧,一切都到下一个转义期。
猜你喜欢
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多