背景
写一个直引号到 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})
##问题
什么正则表达式可以正确地将这四个收缩进行分类?
1条答案
按热度按时间jhkqcmku1#
这个正则表达式应该做你想做的。它使用命名的捕获组对单词进行分类,并使用适当的lookaround,以确保将整个单词与所需的外部引号匹配:
组
inner
查找包含一定数量的字母组并后跟引号的字符串(?:\p{L}+')+
后面跟着一些字母\p{L}+
.组
began
查找一个字符串,该字符串包含引号的若干组,后跟若干字母(?:'\p{L}+)+
.组
ended
查找包含一定数量的字母组并后跟引号的字符串(?:\p{L}+')+
.组
outer
查找两端都有引号,中间有一些字母的字符串'\p{L}+'
.在regex101上演示