剪切与模式匹配的第一个单词(来自字符串)

时间:2012-10-15 18:44:34

标签: c# regex string winforms

我有一句话:

  

“这只是一个例子”

我需要在第一个''字符之间剪切。

到目前为止,我正在使用以下Regex方法:

string name_only = Regex.Match("This 'is' just an example", @"\'([^)]*)\'").Groups[1].Value;
  

结果:是

它工作得非常好,直到另一个'出现:

  

“这'只是一个例子”

现在我得到了:

  

结果:只是一个e

如何解决这个问题(除了使用“for”循环迭代并找到前两个字符'然后使用子字符串切割单词)?

3 个答案:

答案 0 :(得分:2)

问题在于你的正则表达式是以贪婪的方式行事,如果你把它改成以下它会起作用:

@"\'([^)]*?)\'"

答案 1 :(得分:1)

默认情况下,正则表达式遵循“最左边最长的规则”:匹配最左边,最长的子字符串。

我倾向于使正则表达式更具体地说明它应该匹配的内容,因此:

'(([^']|(''))*)'

那应该匹配:

  • 引入单引号字符,后跟
  • 零个或多个实例
    • 单引号字符以外的单个字符,或
    • “转义”单引号字符:两个连续的单引号字符,
  • 后面是引出单引号字符。

$ 0然后为您提供整个匹配,$ 1为匹配报价值的内容,不包括引入/引出报价。

答案 2 :(得分:0)

http://msdn.microsoft.com/en-us/library/3206d374.aspx#Greedy

  

贪婪和懒惰的量词

     

许多量词有两个版本:

     
      
  1. 贪婪的版本。

         

    贪婪的量词试图尽可能多地匹配一个元素。

  2.   
  3. 非贪婪(或懒惰)版本。

         

    非贪婪量词尝试尽可能少地匹配元素。只需添加一个?。

  4. ,就可以将贪婪的量词变成一个懒惰的量词