我正在尝试匹配缺少右引号的文本中的句子(我使用的是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>
答案 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个或多个重复$
-字符串的结尾。答案 2 :(得分:0)
我对正则表达式了解不多,但是您可以尝试检查具有以下内容的字符串:
所有这些条件共同起作用。
答案 3 :(得分:0)
您可以在正则表达式中添加修饰符“ global”或“ multiline”。报价也可能在下一行关闭。