为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
白板的微信 2021-06-29 13:52:01
我正在尝试匹配缺少结束单引号的文本中的句子(我使用的是 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 的任何情况——让我们忽略复数所有格后面可以跟一个空格的事实,因为这会让事情变得太困难。)
查看完整描述

2 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

人们怎么知道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'。有点这种想法

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


查看完整回答
反对 回复 2021-07-02
?
青春有我

TA贡献1784条经验 获得超8个赞

您可以使用

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

查看正则表达式演示

正则表达式详情

  • ^ - 字符串的开始

  • (?:[^']|\b'\b)*- 0 次或多次重复任何字符,但'或任何'用单词字符括起来的字符

  • (?!\b'\b)'-'不包含字符字符

  • (?:[^']|\b'\b)*- 0 次或多次重复任何字符,但'或任何'用单词字符括起来的字符

  • $ - 字符串的结尾。

正则图

//img1.sycdn.imooc.com//60debe160001505908100142.jpg

//img1.sycdn.imooc.com//60debe1e0001125f04420148.jpg

查看完整回答
反对 回复 2021-07-02
  • 2 回答
  • 0 关注
  • 230 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信