在忽略撇号时如何匹配不完整的单引号?

时间:2019-05-22 07:25:48

标签: php regex

我正在尝试匹配缺少右引号的文本中的句子(我使用的是PHP)。对此的简单解决方案是:

~'[^']*$~

但不能解决撇号。

例如,在这些句子中

'This is incomplete
'This isn't incomplete.'  
I said 'this is incomplete.   
I said 'this isn't incomplete but I was wrong.

除了第二个,我想匹配所有这些,第二个不遗漏其结束语。

我尝试使用负前瞻来排除正确关闭的引号(例如,后面跟一个空格,一个句点(或其他句子结尾的标点符号)或该行的结尾),但我无法理解是的。

(撇号后面要加上s,l,r,d或v的任何撇号情况-让我们忽略一个事实,即复数所有格后面可以有一个空格,因为这会使事情变得太难了。)< / p>

4 个答案:

答案 0 :(得分:3)

I said 'this isn't incomplete but I was wrong.中如何知道引用的部分应该在incomplete之后结束。用普通的方法不是不可能。

假设您处理单行字符串,我的简单想法就是

\B'(.*?)'\B|\B'(.*[^'\s])

,并替换为'$1$2'。参见this demo at regex101

这个想法是

  • \B'(.*?)'\B可以使用所有不以字字符\B 非字词边界),直到单引号后没有单词字符,然后将内容捕获到$1
  • \B'(.*[^'\s])寻找未包含单词字符的其余',并捕获任何内容,直到最后一个不是空格\s或{{1 }}。
  • 最后用$2替换已经完成的$1和未完成的$2。有点this idea

远离完美,但希望有所帮助。

答案 1 :(得分:1)

您可以使用

preg_match("~^(?:[^']|\b'\b)*(?!\b'\b)'(?:[^']|\b'\b)*$~", $s)

请参见regex demo

正则表达式详细信息

  • ^-字符串的开头
  • (?:[^']|\b'\b)*-除'或任何用字符char括起来的'之外的任何char的0个或多个重复
  • (?!\b'\b)'-一个',不包含单词字符
  • (?:[^']|\b'\b)*-除'或任何用字符char括起来的'之外的任何char的0个或多个重复
  • $-字符串的结尾。

Regulex graph

enter image description here

enter image description here

答案 2 :(得分:0)

我对正则表达式了解不多,但是您可以尝试检查具有以下内容的字符串:

  • 单数撇号
  • 从一个开始
  • 以一个结尾

所有这些条件共同起作用。

答案 3 :(得分:0)

您可以在正则表达式中添加修饰符“ global”或“ multiline”。报价也可能在下一行关闭。