使用正则表达式切换多语言子字符串位置

Posted

技术标签:

【中文标题】使用正则表达式切换多语言子字符串位置【英文标题】:Switching multi-language substring positions using regex 【发布时间】:2021-12-16 14:00:32 【问题描述】:

带有立陶宛字母的原始输入:

Ą.BČ
Ą.BČ D Ę
Ą. BČ
Ą. BČ D Ę
Ą BČ
Ą BČ D Ę
Examples below should not be affected.
ĄB ČD DĘ

预期结果:

BČ Ą.
BČ Ą. D Ę
BČ Ą. 
BČ Ą. D Ę
BČ Ą 
BČ Ą D Ę
ĄB ČD DĘ

我尝试过的:

^(.\.? *)([\pL\pN\pM]*)$
With ReplaceAllString substitution like so
$2 $1

我尝试了各种模式,但这是我目前能想到的最好的模式。 它设法捕获第 1、第 3 和第 5 行并成功替换,如下所示: (除了行尾一些多余的空格)

BČ Ą.
Ą.BČ D Ę
BČ Ą. 
Ą. BČ D Ę
BČ Ą 
Ą BČ D Ę
ĄB ČD DĘ

解释:

有一组数据具有不同的基础基础条目 结构[FIRST NAME FIRST LETTER][LASTNAME] 理想情况下 带到[LASTNAME][SPACE][FIRST NAME FIRST LETTER][DOT]?

链接到正则表达式101: regex101

最终解决方案:

^([\pL\pN\pM](?:\. *| +))([\pL\pN\pM]+)
    With ReplaceAllString substitution like so
    $2 $1

【问题讨论】:

【参考方案1】:

对于您的示例数据,您可以省略锚点 $ 并匹配一个点,后跟可选空格,或者 1 个或多个空格。

为防止字符类出现空匹配,您可以使用+ 而不是* 重复1 次或多次

^(.(?:\. *| +))([\pL\pN\pM]+)

查看regex demo

注意 . 可以匹配任何字符,包括空格。您也可以将点更改为单个 [\pL\pN\pM]

【讨论】:

我明白了,所以通过在括号内使用 ?: 可以匹配表达式但不捕获它。通过省略锚,我仍然可以指定所需的模式必须从第一组开始,对吗? @papshmeare (?: 确实是一个非捕获组,其中的交替匹配点和可选空格,或 1+ 个空格,因此最后一个示例中的 ĄB 与那里不匹配它们之间应该至少有一个字符。由于您的模式中的锚点$,您无法匹配Ą.BČ D Ę,因为由于缺少空格,该模式不会考虑最后两个字符。如果你要添加一个空格,你会匹配太多。见regex101.com/r/ot1wfI/1 不幸的是,在第二组中玩弄那个额外的空间花了我相当多的时间,但现在我很清楚对非捕获组的介绍,我应该多花点时间阅读文档,感谢您的回复!

以上是关于使用正则表达式切换多语言子字符串位置的主要内容,如果未能解决你的问题,请参考以下文章

Java 正则表达式匹配基本多语言平面之外的字符

正则表达式及多语言操作指南

正则表达式位置匹配攻略【转】

文字 编码 正则表达式 切换

正则表达式如何匹配空值?

正则表达式如何匹配空值?