【问题标题】:Regex match "target string"正则表达式匹配“目标字符串”
【发布时间】:2012-01-11 19:35:04
【问题描述】:

环境:Visual Studio 2008 SP1

如何编写以下正则表达式?

我正在尝试访问 '目标字符串。模式是 [name]=' '

之间的任何字符串
/*Input String*/
SET [blah] = 'AE', [blah] = 'A1A', [number] = 004 WHERE [name]='target string'


/*Current Regex*/
(?<=[?name]?=).*(?=\')

/*Current Results*/
'AE', [blah] = 'A1A', [number] = 004 WHERE [name]='target string

/*Desired Results*/
'target string

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    您需要转义方括号,否则它们会被误解为创建字符类。也就是说,你需要:

    (?<=\[?name\]?=).*(?=\')
    

    我还建议将.* 更改为更明确的'[^']*,这样您就不会冒险在目标字符串之后 捕获任何内容;并且 Tim Pietzcker 指出(在现已删除的评论中)您可以写 ' 而不是 \' (接近正则表达式的末尾);所以:

    (?<=\[?name\]?=)'[^']*(?=')
    

    【讨论】:

      【解决方案2】:

      这样可以吗?

      (?<=\[name]=).*?(?=')
      

      或者如果目标字符串必须在没有前导(')的情况下返回:

      (?<=\[name]=').*?(?=')
      

      注意:我假设目标字符串没有转义撇号 ('')。


      编辑:这可以用转义的撇号来解决问题:

      (?<=\[name]=)(''|.)+?(?='([^']|$))
      

      它将在

      中找到“'John''s pub
      SET [blah] = 'AE', [blah] = 'A1A', [number] = 004 WHERE [name]='John''s pub'
      

      【讨论】:

      • OP 的正则表达式有方括号作为可选,我相当肯定这是故意的:这看起来像 SQLServer UPDATE 语句的片段,其中字段名称可以-但是- 不需要用方括号括起来。
      • 是的,?将使括号可选。
      • 不是“会”制造,“会”制造。 (我是说我认为您提出的正则表达式是错误的。)
      • 我已经在问题中给出的示例中对其进行了测试。它给出了预期的结果。 “将”我的意思是“如果被要求”。
      猜你喜欢
      • 2012-06-05
      • 2013-12-25
      • 1970-01-01
      • 2013-01-11
      相关资源
      最近更新 更多