java 英语灾难

gupuwyp2  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(504)

背景

写一个直引号到 curl 引号的转换器,我想把替换分为几个不同的步骤。第一步是使用已知缩略语的词典替换文本中的缩略语。这并不能解决模棱两可的问题,但应该转换普通缩略语中的直引号用法。

问题

在 java , \b 以及 \w 不要把撇号作为单词的一部分,这使得这个问题有点棘手。问题在于:
包含一个或多个撇号,但不要以一个(内部)开头或结尾;
以撇号开头,可以包含一个或多个,但不要以一个(开始)结尾;
以撇号结尾,可以包含一个或多个,但不能以一个(结束)开头;和
以撇号开头和结尾,但不能包含一个(外部)。

代码

给出一些荒谬的文字:
什么?不会吧“twas”或“twasn't”是指“tween dawn”和“tween dawn”之类的东西。做饭山姆家,哟
正则表达式应该捕获以下单词:
内部: 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}) ##问题
什么正则表达式可以正确地将这四个收缩进行分类?

jhkqcmku

jhkqcmku1#

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

(?<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}))

inner 查找包含一定数量的字母组并后跟引号的字符串 (?:\p{L}+')+ 后面跟着一些字母 \p{L}+ .
began 查找一个字符串,该字符串包含引号的若干组,后跟若干字母 (?:'\p{L}+)+ .
ended 查找包含一定数量的字母组并后跟引号的字符串 (?:\p{L}+')+ .
outer 查找两端都有引号,中间有一些字母的字符串 '\p{L}+' .
在regex101上演示

相关问题