我想在引号之间得到一个字符串,
我知道一个解决方案是:
/'.*?'/
但问题是它不适用于英语
中的所有格或收缩格,例如:
What is the name of Mario's brother in the 'Super Mario' video games?
或者
He's my brother
它不能与那些句子一起工作
一种选择是确保在开始之前和结束之后没有单词边界'
:
/\B'.*?'\B/
单词字符(通常是正则表达式中的字母、数字、下划线)和非单词字符(其他任何字符或字符串的结尾)之间的位置构成单词边界(\b
)。所有其他位置由 匹配\B
。
顺便说一句,如果您也想允许双引号,您可以使用反向引用确保一致的定界:
/\B(['"]).*?\1\B/
如果你只使用['"]
两次,那么类似的东西here "my' string
会给你一个匹配,你可能不想要。请注意,根据您定义正则表达式的方式,您可能需要转义其中一个引号。
在 .NET Regex 风格中,您有平衡组,并且可能有 C 的 Regex 库也支持它。这是至少使用平衡组的解决方案:
(?<NestingCount>\B'\b)(?:(?<NestingCount>\B'\b)|(?<-NestingCount>\b(?:[?])?'\B)|.)+?(?(NestingCount)(?!))
这适用于您的两个示例(假设它们被'包围)。
关于我的解决方案的一些评论:
\B'\b
。\b(?:[?])?'\B
。这(?:[?])?
部分是允许一个单词以可选的 ? 标记结尾,[?]
如果我忘记了应该存在的其他单词结尾,您可以在组 ( ) 中添加更多内容。使用否定的前瞻和后瞻断言:
/(?<!\w)[\'\"][\w\s\?\'\.\!\,\;\:]+[\'\"](?!\w)/
搭配简单的图案/\B'.*?'\B/