微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

英语收缩灾难

如何解决英语收缩灾难

背景

一个直引号到弯引号转换器,我希望将替换分成几个不同的步骤。第一步是使用已知收缩的词典替换文本中的收缩。这不会解决歧义,但应该转换常见收缩中的直接引用用法

问题

在 Java 中,\b\w 不包含撇号作为单词的一部分,这使得这个问题有点棘手。问题在于匹配以下单词:

  • 包含一个或多个撇号,但不以一个内部)开头或结尾;
  • 以撇号开头,可以包含一个或多个,但不以一个结尾(开始);
  • 以撇号结尾,可以包含一个或多个,但不要以一个开头(结束);和
  • 以撇号开头和结尾,但不能包含撇号(外部)。

代码

给出一些无意义的文字

'Twas --- Wha'?不会吧? 'Twas,或'twasn't,'这就是'黎明'和'黄昏'n的东西。做饭? “山姆”的地方,“哟”

正则表达式应捕获以下单词:

  • 内部what's
  • 开始'Twas'Twas'twasn't'tis'tween'n
  • 结束Wha'Wouldn'tcha'Cookin'
  • 'n''Sams''yo'

以下是无效的表达方式,混杂了一些恶意的想法:

  • 内部\p{L}+'\p{L}*\p{L}
  • 开始((?<=[^\p{L}])|^)'\p{L}+('\p{L}|\p{L})?
  • 结束(\p{L}|\p{L}')+'(?=[^\p{L}]|$)

这个似乎有效:

  • ((?<=[^\p{L}])|^)'\p{L}+'(?!\p{L})

问题

什么样的正则表达式可以正确地对这四重收缩进行分类

解决方法

这个正则表达式应该做你想做的。它使用命名的捕获组以适当的环顾对单词进行分类,以确保我们将整个单词与所需的外部引号匹配:

(?<inner>(?<![\p{L}'])(?:\p{L}+')+\p{L}+(?![\p{L}']))|
(?<began>(?<!\p{L})(?:'\p{L}+)+(?![\p{L}']))|
(?<ended>(?<![\p{L}'])(?:\p{L}+')+(?!\p{L}))|
(?<outer>(?<!\p{L})'\p{L}+'(?!\p{L}))

Group inner 查找包含一定数量的字母组后跟引号 (?:\p{L}+')+ 后跟一定数量的字母 \p{L}+ 的字符串。

Group began 查找包含一定数量的引号组和一定数量的字母 (?:'\p{L}+)+ 的字符串。

Group ended 查找包含一定数量的字母组后跟引号 (?:\p{L}+')+ 的字符串。

Group outer 查找两端带有引号且中间带有一些字母 '\p{L}+' 的字符串。

Demo on regex101

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。