【问题标题】:Regex return always false in C# [duplicate]正则表达式在 C# 中总是返回 false [重复]
【发布时间】:2019-06-27 10:33:56
【问题描述】:

我有这样的正则表达式:

(?i)^(?!.*\bWITH\b).*\(\s*.*\s*\b(INDEX|FASTFIRSTROW|HOLDLOCK|SERIALIZABLE|REPEATABLEREAD|READCOMMITTED|READUNCOMMITTED|ROWLOCK|PAGLOCK|TABLOCK|TABLOCKX|NOLOCK|UPDLOCK|XLOCK|READPAST)\b\s*.*\s*\)

它在http://regexstorm.net 中返回true。

但是当我在 C# 中运行时,它总是返回 false。

字符串输入到文本:

INNER JOIN t_hat_meisaimidasi AS MM (READCOMMITTED, NOLOCK) WHERE ( AND hat_kanri_no = ? 

谁能解释一下为什么?

【问题讨论】:

  • 暂时思考一下:DacFx package 包括一个功能齐全的 T-SQL 解析器 (Microsoft.SqlServer.TransactSql.ScriptDom.TSqlParser)。从长远来看,这可能比使用正则表达式更值得。
  • 我将继续要求人们停止对使用哪种人类语言进行编程;它与问题无关,并且问题根本不受选择的影响。不停地谈论它会走一条细线。

标签: c# regex


【解决方案1】:

为我返回true;可能你没有使用@"...",所以转义标记(\b 等)不是你认为的那样:

Console.WriteLine(Regex.IsMatch(
    @"INNER JOIN t_hat_meisaimidasi AS MM (READCOMMITTED, NOLOCK) WHERE ( AND hat_kanri_no = ?",
    @"(?i)^(?!.*\bWITH\b).*\(\s*.*\s*\b(INDEX|FASTFIRSTROW|HOLDLOCK|SERIALIZABLE|REPEATABLEREAD|READCOMMITTED|READUNCOMMITTED|ROWLOCK|PAGLOCK|TABLOCK|TABLOCKX|NOLOCK|UPDLOCK|XLOCK|READPAST)\b\s*.*\s*\)"));

注意:"\b" 是一个长度为 1 的字符串,其中包含一个退格字符; @"\b" 是一个长度为 2 的字符串,其中包含一个斜杠和一个 b。在处理正则表达式时,您几乎总是希望使用逐字字符串文字 (@"...")。

为了让它变得更好:Visual Studio 将使用着色来告诉你什么时候做对了:

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 2012-05-31
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2015-09-15
    • 2023-04-06
    相关资源
    最近更新 更多