正则表达式 - 压缩空格并删除名称中的点
regex - squeeze spaces and remove dots in the names
我正在清理 NAMES,即删除实际名称开始前的点和空格。
示例 - 下面是测试文件
$ cat names.txt
J.J. Scott
J. S. Joyce
RV. Bradley Carter
M. N. K. Brailey
$
我需要如下输出
JJ Scott
JS Joyce
RV Bradley Carter
MNK Brailey
以下 perl 尝试并不适用于所有情况。
perl -ne ' s/\.//g; s/ //; print ' names.txt
您可能会使用:
\G\p{Lu}+\K[.\h]+(?!\p{Lu}\p{Ll})
\G
断言上一场比赛结束时的位置,或在本例中的开始处
\p{Lu}+\K
匹配 1+ 个大写字符并忘记到目前为止使用 \K
匹配的内容
[.\h]+
匹配 1+ 次点或水平空白字符
(?!
否定前瞻,断言直接在右边的不是
\p{Lu}\p{Ll}
匹配一个大写字符后跟一个小写字符
)
关闭前瞻
在替换中使用空字符串。
例如
perl -pe 's/\G\p{Lu}+\K[.\h]+(?!\p{Lu}\p{Ll})//g' names.txt
输出
JJ Scott
JS Joyce
RV Bradley Carter
MNK Brailey
你可能需要一个消极的前瞻。第一个正则表达式删除点。第二个和第三个正则表达式是相同的,并且都从 space 分隔的大写(大写)字母中删除 space,除非第二个正则表达式后跟一个小写字母。三声名需要重复;否则,你会得到 MN K Brailey
。使用 -p
而不是 -n
可以避免在代码中编写 print
。
perl -pe 's/\.//g; s/([A-Z]) ([A-Z])(?![a-z])//g; s/([A-Z]) ([A-Z])(?![a-z])//g' names.txt
输出:
JJ Scott
JS Joyce
RV Bradley Carter
MNK Brailey
您可以使用此 perl
命令在单个替换中执行此操作:
perl -pe 's/\.\h*(?=(?:[A-Z]\.)*\h+[A-Z])//g' file
JJ Scott
JS Joyce
RV Bradley Carter
MNK Brailey
正则表达式详细信息:
\.\h*
:匹配一个点后跟 0 个或多个 space 或制表符
(?=(?:[A-Z]\.)*\h+[A-Z])
:先行断言我们有 0 个或多个缩写,后跟一个 space 和一个大写字母
我正在清理 NAMES,即删除实际名称开始前的点和空格。 示例 - 下面是测试文件
$ cat names.txt
J.J. Scott
J. S. Joyce
RV. Bradley Carter
M. N. K. Brailey
$
我需要如下输出
JJ Scott
JS Joyce
RV Bradley Carter
MNK Brailey
以下 perl 尝试并不适用于所有情况。
perl -ne ' s/\.//g; s/ //; print ' names.txt
您可能会使用:
\G\p{Lu}+\K[.\h]+(?!\p{Lu}\p{Ll})
\G
断言上一场比赛结束时的位置,或在本例中的开始处\p{Lu}+\K
匹配 1+ 个大写字符并忘记到目前为止使用\K
匹配的内容
[.\h]+
匹配 1+ 次点或水平空白字符(?!
否定前瞻,断言直接在右边的不是\p{Lu}\p{Ll}
匹配一个大写字符后跟一个小写字符
)
关闭前瞻
在替换中使用空字符串。
例如
perl -pe 's/\G\p{Lu}+\K[.\h]+(?!\p{Lu}\p{Ll})//g' names.txt
输出
JJ Scott
JS Joyce
RV Bradley Carter
MNK Brailey
你可能需要一个消极的前瞻。第一个正则表达式删除点。第二个和第三个正则表达式是相同的,并且都从 space 分隔的大写(大写)字母中删除 space,除非第二个正则表达式后跟一个小写字母。三声名需要重复;否则,你会得到 MN K Brailey
。使用 -p
而不是 -n
可以避免在代码中编写 print
。
perl -pe 's/\.//g; s/([A-Z]) ([A-Z])(?![a-z])//g; s/([A-Z]) ([A-Z])(?![a-z])//g' names.txt
输出:
JJ Scott
JS Joyce
RV Bradley Carter
MNK Brailey
您可以使用此 perl
命令在单个替换中执行此操作:
perl -pe 's/\.\h*(?=(?:[A-Z]\.)*\h+[A-Z])//g' file
JJ Scott
JS Joyce
RV Bradley Carter
MNK Brailey
正则表达式详细信息:
\.\h*
:匹配一个点后跟 0 个或多个 space 或制表符(?=(?:[A-Z]\.)*\h+[A-Z])
:先行断言我们有 0 个或多个缩写,后跟一个 space 和一个大写字母