英国收缩灾难
English contraction catastrophes
背景
正在将直引号写入弯引号转换器,并希望将替换分为几个不同的步骤。第一步是使用已知缩略语的词典替换文本中的缩略语。这不会解决歧义,但应该将直引号用法转换为常见的缩略语。
问题
在 Java、\b
和 \w
中不包括撇号作为单词的一部分,这使得这个问题有点挑剔。问题在于匹配词:
- 包含一个或多个撇号,但不以一个撇号开头或结尾(inner);
- 以撇号开头,可以包含一个或多个,但不能以一个结尾(began);
- 以撇号结尾,可以包含一个或多个,但不能以一个开头(ended);和
- 以撇号开头和结尾,但不能包含撇号(外部)。
代码
给定一些无意义的文本:
'Twas---Wha'? Wouldn'tcha'? 'Twas, or 'twasn't, 'tis what's 'tween dawn 'n' dusk 'n stuff. Cookin'? 'Sams' place, 'yo''
正则表达式应捕获以下单词:
- 内:
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}+'
.
背景
正在将直引号写入弯引号转换器,并希望将替换分为几个不同的步骤。第一步是使用已知缩略语的词典替换文本中的缩略语。这不会解决歧义,但应该将直引号用法转换为常见的缩略语。
问题
在 Java、\b
和 \w
中不包括撇号作为单词的一部分,这使得这个问题有点挑剔。问题在于匹配词:
- 包含一个或多个撇号,但不以一个撇号开头或结尾(inner);
- 以撇号开头,可以包含一个或多个,但不能以一个结尾(began);
- 以撇号结尾,可以包含一个或多个,但不能以一个开头(ended);和
- 以撇号开头和结尾,但不能包含撇号(外部)。
代码
给定一些无意义的文本:
'Twas---Wha'? Wouldn'tcha'? 'Twas, or 'twasn't, 'tis what's 'tween dawn 'n' dusk 'n stuff. Cookin'? 'Sams' place, 'yo''
正则表达式应捕获以下单词:
- 内:
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}+'
.