我想在引号之间加一个字符串 我知道一个解决方案:
/'.*?'/
但问题在于它不适用于英语中的占有情况或收缩情况 例如:
What is the name of Mario's brother in the 'Super Mario' video games?
或
He's my brother
它无法使用那些句子
答案 0 :(得分:2)
一种选择是确保在开幕之前和结束之后没有单词边界'
:
/\B'.*?'\B/
单词字符(通常是正则表达式中的字母,数字,下划线)和非单词字符(字符串的任何其他内容或末尾)之间的位置构成单词边界(\b
)。所有其他职位均由\B
匹配。
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/