gpt4 book ai didi

regex - 基于字符串中大写/小写和位置的德语元音变音的 Powershell 正则表达式

转载 作者:行者123 更新时间:2023-12-05 09:26:11 25 4
gpt4 key购买 nike

我正在尝试在 Powershell 中编写一个脚本来转换德语元音变音

ä, ö, ü, ß to ae, oe, ue, ss 

Ä, Ö, Ü, ß to AE or Ae, UE or Ue, and SS.

问题是我还需要根据变音符号的位置进行区分。

ÜNLÜ > UENLUE
Ünlü > Uenlue (Ue)
SCHNEEWEIß > SCHNEEWEISS
Schneeweiß > Schneeweiss
Geßl > Gessl
GEßL > GESSL
Josef Öbinger > Josef Oebinger (one string)
Jürgen MÜLLER > Juergen MUELLER (one string)

破坏我一天的主要问题是元音变音 ß

ß没有大小写之分

我需要根据前一个字符是大写还是小写来识别 ß

我尝试了各种正则表达式,例如 [ÄÖÜßA-Z]{1,}(?![\sa-zäüö])[ÄÖÜßA-Z][ÄÖÜß][^a-z ]

ss还是ss我基本上是不可能搞清楚的。除此之外,像 ÜNLÜ 这样的词只能用一个变音符号识别,因为带有变音符号的字母在单词的末尾。

我需要 3 个匹配的正则表达式模式。一种用于大写,一种用于小写,一种用于混合大小写(Oebinger)

然后这 3 个模式将被放入 powershell 的 3 个 IF 条件中,然后我可以根据匹配的模式盲目转换。

[ÄÖÜß][^a-z] 适用于 ÜNLÜ > UENLUE

[äöüß][^A-Z] 适用于 Jürgen > Juergen

但 Schneeweiß 和 SCHNEEWEIß 中的 ß 与这两种模式都匹配。这不是我想要的。

我需要一个模式来检查 ß 前后的字母是小写还是大写。如果小写比 ß = ss,如果大写则 ß = SS

第三种情况,混合大小写并不需要单独的正则表达式。我基本上可以采用 String Jürgen MÜLLER,通过两种模式在 powerscript 中运行它。 First Pattern 会将其转换为 Jürgen MUELLER。接受它并再次运行它以获得 Juergen MUELLER。

变音符号 ß 始终相同。小写 = 大写。这就是让整个事情变得如此困难的原因。

我正在失去希望。请帮帮我。

最佳答案

PowerShell (Core) 7+ 提供了一个简洁的解决方案,因为 -replace 那里的运营商接受 script block作为替换操作数,它可以根据找到的每个匹配项实现灵活、动态的替换:

$strings = @(
'ÜNLÜ' # > UENLUE
'Ünlü' # > Uenlue (Ue)
'SCHNEEWEIß' # > SCHNEEWEISS
'Schneeweiß' # > Schneeweiss
'Geßl' # > Gessl
'GEßL' # > GESSL
'Josef Öbinger' # > Josef Oebinger
'Jürgen MÜLLER' # > Juergen MUELLER
'THEÖ HÄRSHERIN' # > THEOE HAERSHERIN
'MÄßIG' # > MAESSIG
)

$strings `
-replace '[äöü](?:(?=ß)|\p{L})?', {
([string] $_.Value[0]).Normalize('FormD')[0] +
([char]::IsUpper($_.Value[1] ?? $_.Value[0]) ? 'E' : 'e') +
$_.Value[1]
} `
-replace '.ß', {
$_.Value[0] + ([char]::IsUpper($_.Value[0]) ? 'SS' : 'ss')
}

注意:

  • 调用 .Normalize('FormD')[0]在包含单个元音变音字符的字符串上,实际上将该字符转换为它的 ASCII 基本字母;例如,ü变成 u - 参见 System.String.Normalize .

Windows PowerShell(最新和最后版本为 v5.1 的仅限 Windows 的遗留版本):

因此,解决方案要复杂得多:

$strings | ForEach-Object {
$aux =
[regex]::Replace(
$_,
'[äöü](?:(?=ß)|\p{L})?',
{
param($m)
([string] $m.Value[0]).Normalize('FormD')[0] +
$(if ([char]::IsUpper($(if ($m.Value[1]) { $m.Value[1] } else { $m.Value[0] }))) { 'E' } else { 'e' }) +
$m.Value[1]
},
'IgnoreCase'
)
[regex]::Replace(
$aux,
'.ß',
{
param($m)
$m.Value[0] + $(if ([char]::IsUpper($m.Value[0])) { 'SS' } else { 'ss' })
},
'IgnoreCase'
)
}

注意:以上是 PowerShell (Core) 7+ 解决方案的直接等价物,但第二个 [regex]::Replace() call 可以替换为以下内容,如 js2010's answer 中所示:

$aux -creplace '(?<=\p{Ll})ß', 'ss' -creplace '(?<=\p{Lu})ß', 'SS'

关于regex - 基于字符串中大写/小写和位置的德语元音变音的 Powershell 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74117811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com