0

我有一句话:

“这‘只是’一个例子”

我需要剪切第一个 ' ' 字符之间的单词。

到目前为止,我一直在使用以下正则表达式方法:

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

结果:是

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

“这‘只是’一个例子”

现在我得到:

结果:只是一个 e

我该如何解决这个问题(除了使用“for”循环进行迭代并找到字符的前两个索引,然后使用子字符串剪切单词)?

4

3 回答 3

2

问题是您的正则表达式以贪婪的方式行事,如果您将其更改为以下内容,它将起作用:

@"\'([^)]*?)\'"
于 2012-10-15T18:48:20.887 回答
1

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

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

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

那应该匹配:

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

然后 $0 为您提供整个匹配项,并为您提供匹配的引用值的内容,不包括导入/导出引号。

于 2012-10-15T19:39:10.890 回答
0

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

贪婪和懒惰的量词

许多量词有两个版本:

  1. 贪婪的版本。

    贪心量词会尝试尽可能多地匹配一个元素。

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

    非贪婪量词尝试尽可能少地匹配元素。您可以通过简单地添加一个 ? 将贪婪量词变成惰性量词。

于 2012-10-15T19:52:16.130 回答