可变音译powershell

如何解决可变音译powershell

有一个我无法快速解决的问题。 关键是要遍历两个带有字母的表中的所有匹配项。 例如我的脚本

function global:TranslitToLAT {
    param([string]$inString)
    $Translit_To_LAT = @{
        [char]'а' = "a"
        [char]'А' = "a"
        [char]'б' = "b"
        [char]'Б' = "b"
        [char]'в' = "v"
        [char]'В' = "v"
        [char]'г' = "g"
        [char]'Г' = "g"
        [char]'д' = "d"
        [char]'Д' = "d"
        [char]'е' = "e"
        [char]'Е' = "e"
        [char]'ё' = "e"
        [char]'Ё' = "e"
        [char]'ж' = "zh"
        [char]'Ж' = "zh"
        [char]'з' = "z"
        [char]'З' = "z"
        [char]'и' = "i"
        [char]'И' = "i"
        [char]'й' = "y"
        [char]'Й' = "y"
        [char]'к' = "k"
        [char]'К' = "k"
        [char]'л' = "l"
        [char]'Л' = "l"
        [char]'м' = "m"
        [char]'М' = "m"
        [char]'н' = "n"
        [char]'Н' = "n"
        [char]'о' = "o"
        [char]'О' = "o"
        [char]'п' = "p"
        [char]'П' = "p"
        [char]'р' = "r"
        [char]'Р' = "r"
        [char]'с' = "s"
        [char]'С' = "s"
        [char]'т' = "t"
        [char]'Т' = "t"
        [char]'у' = "u"
        [char]'У' = "u"
        [char]'ф' = "f"
        [char]'Ф' = "f"
        [char]'х' = "h"
        [char]'Х' = "h"
        [char]'ц' = "ts"
        [char]'Ц' = "ts"
        [char]'ч' = "ch"
        [char]'Ч' = "ch"
        [char]'ш' = "sh"
        [char]'Ш' = "sh"
        [char]'щ' = "sch"
        [char]'Щ' = "sch"
        [char]'ъ' = "" # "``"
        [char]'Ъ' = "" # "``"
        [char]'ы' = "y" # "y`"
        [char]'Ы' = "y" # "Y`"
        [char]'ь' = "" # "`"
        [char]'Ь' = "" # "`"
        [char]'э' = "e" # "e`"
        [char]'Э' = "e" # "E`"
        [char]'ю' = "yu"
        [char]'Ю' = "yu"
        [char]'я' = "ya"
        [char]'Я' = "ya"
        [char]' ' = "_"
    }
    $outChars = ""
    $TwoLetter_To_LAT = @{
        [string]'ъи' = 'yi'
        [string]'ьи' = 'yi'
        [string]'ье' = 'ye'
        [string]'ъe' = 'ye'
        [string]'ий' = 'ii'
        [string]'кс' = 'x'
        [string]'ц' = 'c'
    }

    $chars = $inString.ToCharArray();
    $outChars1 = $outChars
    foreach ($char in $chars) {
    $outChars1 += $Translit_To_LAT[$char]

    $outChars11 = Write-Output $outChars1 `n
    
    }
    
    

    $TwoLetter_To_LAT.GetEnumerator().name | % {
        $inString = $inString.Replace($_,$TwoLetter_To_LAT.Item($_))
    }
    $outChars2 = $outChars
    foreach ($c in $inChars = $inString.ToCharArray()) {
        if ($Translit_To_LAT[$c] -ne $Null )
        { $outChars2 += $Translit_To_LAT[$c] }
        else
        { $outChars2 += $c }
    $outChars22 = Write-Output $outChars2 `n
    }
    
    
    $outChars3 = $outChars11 + $outChars22

    Write-Output $outChars3
}

$text = Read-Host "Second name"
$log = TranslitToLAT $text | select $log > c:\users.txt
$log

部分起作用。当用俄语输入姓氏时,第二个表中有两个匹配项,我从第一个表中和第二个表中得到总数。我应该获得4个音译选项! 我将举一个如何使循环遍历表的示例感到满意。

解决方法

稍微改一下,我想您要问的问题是“给定源字符串$inString和替换列表$Translit_To_LAT,返回应用于该列表的所有可能替换列表的列表源字符串”。

例如,我假设您的示例Алексий-将在下面给出4个替换:

1. А-л-е-к-с-и-й -> a-l-e-k-s-i-y 
2. А-л-е-к-с-ий  -> a-l-e-k-s-ii
3. А-л-е-кс-и-й  -> a-l-e-x-i-y
4. А-л-е-кс-ий   -> a-l-e-x-ii

根据您的替代名单,有一些事情需要注意:

  • 区分大小写,例如,可能替换为бБ

  • 某些替换文字在替换文字中包含多个字符-例如ж => "zh"

  • 某些替换项具有多个替换选项-例如ц => c ts

  • 某些替换匹配多个源字符-例如ъи => yi

  • 有时,对于相同的字符序列,可能会有多种替换方式-例如ий可以是两个单独的替换(“ и => iй => y)或单独的“复合”替换({{1} } => ий

我已经将您的代码重写为一个递归函数,该函数基本上执行以下操作:

  • 如果输入字符串为空,则只需返回一个空字符串

  • 否则,枚举可在字符串开头使用的所有替换,然后将它们与字符串的尾部进行递归调用的结果“相乘”

这是代码:

ii

这是一些示例:

function Get-Transliteration
{
    param(
        [string] $InputString
    )

    $lookups = [ordered] @{
        # single character substitutions
        # (we need to use the [char] cast to force case sensitivity for keys)
        [char] "а" = @( "a" )
        [char] "А" = @( "a" )
        [char] "б" = @( "b" )
        [char] "Б" = @( "b" )
        [char] "в" = @( "v" )
        [char] "В" = @( "v" )
        [char] "г" = @( "g" )
        [char] "Г" = @( "g" )
        [char] "д" = @( "d" )
        [char] "Д" = @( "d" )
        [char] "е" = @( "e" )
        [char] "Е" = @( "e" )
        [char] "ё" = @( "e" )
        [char] "Ё" = @( "e" )
        [char] "ж" = @( "zh" )
        [char] "Ж" = @( "zh" )
        [char] "з" = @( "z" )
        [char] "З" = @( "z" )
        [char] "и" = @( "i" )
        [char] "И" = @( "i" )
        [char] "й" = @( "y" )
        [char] "Й" = @( "y" )
        [char] "к" = @( "k" )
        [char] "К" = @( "k" )
        [char] "л" = @( "l" )
        [char] "Л" = @( "l" )
        [char] "м" = @( "m" )
        [char] "М" = @( "m" )
        [char] "н" = @( "n" )
        [char] "Н" = @( "n" )
        [char] "о" = @( "o" )
        [char] "О" = @( "o" )
        [char] "п" = @( "p" )
        [char] "П" = @( "p" )
        [char] "р" = @( "r" )
        [char] "Р" = @( "r" )
        [char] "с" = @( "s" )
        [char] "С" = @( "s" )
        [char] "т" = @( "t" )
        [char] "Т" = @( "t" )
        [char] "у" = @( "u" )
        [char] "У" = @( "u" )
        [char] "ф" = @( "f" )
        [char] "Ф" = @( "f" )
        [char] "х" = @( "h" )
        [char] "Х" = @( "h" )
        [char] "ц" = @( "c","ts")
        [char] "Ц" = @( "ts" )
        [char] "ч" = @( "ch" )
        [char] "Ч" = @( "ch" )
        [char] "ш" = @( "sh" )
        [char] "Ш" = @( "sh" )
        [char] "щ" = @( "sch" )
        [char] "Щ" = @( "sch" )
        [char] "ъ" = @( "" )
        [char] "Ъ" = @( "" )
        [char] "ы" = @( "y" )
        [char] "Ы" = @( "y" )
        [char] "ь" = @( "" )
        [char] "Ь" = @( "" )
        [char] "э" = @( "e" )
        [char] "Э" = @( "e" )
        [char] "ю" = @( "yu" )
        [char] "Ю" = @( "yu" )
        [char] "я" = @( "ya" )
        [char] "Я" = @( "ya" )
        [char] " " = @( "_" )
        # multi-character substitutions
        [string] "ъи" = @( "yi" )
        [string] "ьи" = @( "yi" )
        [string] "ье" = @( "ye" )
        [string] "ъe" = @( "ye" )
        [string] "ий" = @( "ii" )
        [string] "кс" = @( "x" )
    }

    # if the input is empty then there's no work to do,# so just return an empty string
    if( [string]::IsNullOrEmpty($InputString) )
    {
        return [string]::Empty;
    }

    # find all the lookups that can be applied at the start of the string
    $keys = @( $lookups.Keys | where-object { $InputString.StartsWith($_) } );

    # if there are no lookups found at the start of the string we'll keep
    # the first character as-is and prefix it to all the transliterations
    # for the remainder of the string
    if( $keys.Length -eq 0 )
    {
        $results = @();
        $head    = $InputString[0];
        $rest    = $InputString.Substring(1);
        $tails   = Get-Transliteration -InputString $rest;
        foreach( $tail in $tails )
        {
            $results += $head + $tail;
        }
        return $results;
    }

    # if we found any lookups at the start of the string we need to "multiply"
    # them with all the transliterations for the remainder of the string
    $results = @();
    foreach( $key in $keys )
    {
        if( $InputString.StartsWith($key) )
        {
            $heads = $lookups[$key];
            $rest  = $InputString.Substring(([string] $key).Length);
            $tails = Get-Transliteration -InputString $rest;
            foreach( $head in $heads )
            {
                foreach( $tail in $tails )
                {
                    $results += $head + $tail;
                }
            }

        }
    }

    return $results;

}

请看这里的维基百科页面-https://en.wikipedia.org/wiki/BGN/PCGN_romanization_of_Russian-我认为音译规则比此功能无法处理的要复杂一些,但希望这是一个开始...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-