正则表达式,用英语引用引号之间的字符串/单词

时间:2012-11-28 20:07:35

标签: c regex

我想在引号之间加一个字符串 我知道一个解决方案:

/'.*?'/

但问题在于它不适用于英语中的占有情况或收缩情况 例如:

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

He's my brother

它无法使用那些句子

4 个答案:

答案 0 :(得分:2)

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

/\B'.*?'\B/

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

Working demo.

Further reading on word boundaries.

顺便说一句,如果你想允许双引号,你可以确保使用反向引用进行一致的分隔:

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

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

答案 1 :(得分:1)

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

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

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

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

  • 我使用平衡组来识别嵌套的引用文本(例如“超级马里奥”)。
  • 我使用\B'\b确定任何引号的开头。
  • 我用\b(?:[?])?'\B标识任何引用的结尾。 (?:[?])?部分允许单词以可选的?-mark结尾,如果我忘记了应该出现的其他单词结尾,您可以向该组添加更多内容([?])。

答案 2 :(得分:0)

使用负向前瞻和后瞻性断言:

/(?<!\w)[\'\"][\w\s\?\'\.\!\,\;\:]+[\'\"](?!\w)/

答案 3 :(得分:0)

使用简单模式/\B'.*?'\B/