猿问

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

我正在尝试匹配缺少结束单引号的文本中的句子(我使用的是 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 的任何情况——让我们忽略复数所有格后面可以跟一个空格的事实,因为这会让事情变得太困难。)


白板的微信
浏览 231回答 2
2回答

精慕HU

人们怎么知道I said 'this isn't incomplete but I was wrong.引用部分应该在incomplete. 用普通手段不是不可能。假设你处理单行字符串,我相当简单的想法是\B'(.*?)'\B|\B'(.*[^'\s])并替换为'$1$2'. 在 regex101 上查看此演示。这个想法是\B'(.*?)'\B使用从前面没有单词字符(\B 非单词边界)的单引号开始的任何“完整”引号,直到后面没有单词字符的单引号并将内容捕获到$1.\B'(.*[^'\s])查找'前面没有单词字符的其余部分并捕获任何内容,直到最后一个不是空格\s或单引号 to 的字符$2。最后更换已经完成$1和uncomplete$2用'$1$2'。有点这种想法。远非完美,但希望有所帮助。

青春有我

您可以使用preg_match("~^(?:[^']|\b'\b)*(?!\b'\b)'(?:[^']|\b'\b)*$~", $s)查看正则表达式演示正则表达式详情^ - 字符串的开始(?:[^']|\b'\b)*- 0 次或多次重复任何字符,但'或任何'用单词字符括起来的字符(?!\b'\b)'-'不包含字符字符(?:[^']|\b'\b)*- 0 次或多次重复任何字符,但'或任何'用单词字符括起来的字符$ - 字符串的结尾。正则图:
随时随地看视频慕课网APP
我要回答