在单引号REGEX中捕获内容时忽略撇号

问题描述 投票:0回答:2

这里的问题是捕获单引号内的内容(如'xyz')。 但撇号与单引号(')的符号相同即将出现!

我写的正则表达式是:/(\w\'\w)(*SKIP)(*F)|(\'[^\']*\')/

我使用的例子是:Hello ma'am 'This is Prashanth's book.'

需要捕获的是:'This is Prashanth's book.'

但是,被捕的是:'This is Prashanth'

这是我在online regex tester上尝试的链接

任何帮助是极大的赞赏。谢谢!

php regex pcre
2个回答
1
投票

您不能使用[^\']捕获包含'的文本,在您的示例中,This is Prashanth's book.在文本中包含'字符。你需要修改你的正则表达式使用.*?而不是[^\']并且可以写你的正则表达式,

(\w'\w)(*SKIP)(*F)|('.*?'\B)

Demo with your updated regex

此外,您不需要转义单引号',因为它在正则表达式中没有特殊含义。

从您的示例中,不清楚您是否希望捕获的匹配包含匹配的'。如果你不想在匹配中捕获',你可以使用基于lookarounds的正则表达式并使用它,

(?<=\B').*?(?='\B)

正则表达式的解释:

  • (?<=\B') - 这背后的积极外观确保在比赛中捕获的内容之前是单引号,其前面没有由\B确保的单词字符
  • .*? - 以非贪婪的方式捕获文本
  • (?='\B) - 确保匹配的文本后跟单引号,\B确保它与任何单词字符后面紧跟的引号不匹配。例如。它不会像's那样匹配结束语

Demo


1
投票

对于您提供的字符串,您可以使用正则表达式:

\B'\K(?:(?!'\B).)+

Click for Demo

说明:

  • \B - 一个非单词边界
  • ' - 匹配'
  • \K - 忘记到目前为止匹配的所有内容
  • (?:(?!'\B).)+ - 匹配任何字符的1 +次出现(换行除外),它不以'开头,后跟非字边界
© www.soinside.com 2019 - 2024. All rights reserved.