2

我想在引号之间得到一个字符串,
我知道一个解决方案是:

/'.*?'/

但问题是它不适用于英语
中的所有格或收缩格,例如:

What is the name of Mario's brother in the 'Super Mario' video games?

或者

He's my brother

它不能与那些句子一起工作

4

4 回答 4

2

一种选择是确保在开始之前和结束之后没有单词边界'

/\B'.*?'\B/

单词字符(通常是正则表达式中的字母、数字、下划线)和非单词字符(其他任何字符或字符串的结尾)之间的位置构成单词边界(\b)。所有其他位置由 匹配\B

工作演示。

进一步阅读单词边界。

顺便说一句,如果您也想允许双引号,您可以使用反向引用确保一致的定界:

/\B(['"]).*?\1\B/

如果你只使用['"]两次,那么类似的东西here "my' string会给你一个匹配,你可能不想要。请注意,根据您定义正则表达式的方式,您可能需要转义其中一个引号。

于 2012-11-28T20:09:48.617 回答
1

在 .NET Regex 风格中,您有平衡组,并且可能有 C 的 Regex 库也支持它。这是至少使用平衡组的解决方案:

(?<NestingCount>\B'\b)(?:(?<NestingCount>\B'\b)|(?<-NestingCount>\b(?:[?])?'\B)|.)+?(?(NestingCount)(?!))

这适用于您的两个示例(假设它们被'包围)。

关于我的解决方案的一些评论:

  • 我使用平衡组来识别嵌套的引用文本(如“超级马里奥”)。
  • 我用 . 标识任何引用的开头\B'\b
  • 我用 . 标识任何引用的结尾\b(?:[?])?'\B。这(?:[?])?部分是允许一个单词以可选的 ? 标记结尾,[?]如果我忘记了应该存在的其他单词结尾,您可以在组 ( ) 中添加更多内容。
于 2012-11-28T21:05:01.363 回答
0

使用否定的前瞻和后瞻断言:

/(?<!\w)[\'\"][\w\s\?\'\.\!\,\;\:]+[\'\"](?!\w)/
于 2012-11-28T20:20:51.683 回答
0

搭配简单的图案/\B'.*?'\B/

于 2012-11-29T00:26:32.733 回答