将每个包含阿拉伯字母的单词更改为反转

问题描述 投票:0回答:1

因为阿拉伯文本在 PowerShell 中会自动反转,所以我必须反转它才能使其可读。 例如,文本

'مرحبا'
看起来会是
'ابحرم'

我可以一一改变它们,但我很难同时处理很多单词。

function ReverseText {
    Return ( -Join ($Args.ToCharArray() | Sort {(--$script:i)}) )
}
$AJoin  = 'ابتثجحخدذرزسشصضطظعغفقكلمنهوي'
$AMatch = $AJoin.ToCharArray() -join '|'

$data = @(
"1. The verb for the male singular in Arabic is?"
"   a) 'تفعل'" 
"   b) 'تفعلان'"  
"   c) 'يفعلون'"  
"   d) 'يفعل'"
"2. 'تلميذ' is the mufrad form of the word?"
"   a) 'تلاميذ'"
"   b) 'تلميذات'"  
"   c) 'تلميذان'" 
"   d) 'تلميذين'"
)

ReverseText 'بيتان'
$Newdata = $data | Foreach {
    If ($_.Split("'") -match $AMatch) {
        'configuous to continue'
    }
}
$Newdata; pause

从脚本中,我可以使用命令

'بيتان'
保留一个单词
ReverseText 'بيتان'

$data
开始,我想将每个阿拉伯语单词更改为相反的字母顺序,然后将其保存在
$Newdata
中。例如,从
.txt
文件中获取的 50 个中只有 2 个。
我还没有足够的能力去做这件事。

我很感激任何帮助。谢谢。

windows powershell unicode arabic right-to-left
1个回答
1
投票
$data | ForEach-Object {
  [regex]::Replace($_, 
    '\p{IsArabic}{2,}',
    { param($m) $chars = $m.Value.ToCharArray(); [Array]::Reverse($chars); -join $chars }
  )
}
$data -replace 
  '\p{IsArabic}{2,}', 
  { $chars = $_.Value.ToCharArray(); [Array]::Reverse($chars); -join $chars }

  • 在这两种情况下,正则表达式

    '\p{IsArabic}{2,}'
    用于匹配所有运行的两个或更多
    {2,}
    )阿拉伯字符(
    \p{IsArabic}
    ),并且任何此类运行的字符都是反向

  • 支持 Unicode 双向文本渲染算法的 PowerShell 主机中 - 例如旧版 Windows 控制台主机 (

    conhost.exe
    ) 和 Windows 终端 - 结果会正确显示,但请注意,此方法应该 ( a) 基本上仅限于此类主机,并且 (b) 只能应用于生成 for-display 输出。

© www.soinside.com 2019 - 2024. All rights reserved.