BHa*_*rms 5 regex powershell polyglot batch-file embedded-resource
我正在尝试创建一种多语言脚本.它不是真正的多语言,因为它实际上需要多种语言来执行,尽管它可以被Shell或Batch"引导".我有这个部分没问题.
我遇到问题的部分是一些嵌入式Powershell代码,它需要能够将当前文件加载到内存中并提取用另一种语言编写的某个部分,将其存储在变量中,最后通过它成了一名翻译.我有一个类似XML的标记系统,我用它来标记文件的各个部分,希望不会与任何其他语言冲突.标记看起来像这样:
lang_a_code
# <{LANGB}>
... code in language B ...
... code in language B ...
... code in language B ...
# <{/LANGB}>
lang_c_code
Run Code Online (Sandbox Code Playgroud)
#是注释标记,但注释标记可以是不同的东西,具体取决于该部分的语言.
我遇到的问题是我似乎无法找到一种方法来隔离文件的那一部分.我可以将整个文件加载到内存中,但我无法获取标记之间的内容.这是我目前的代码:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
powershell -ExecutionPolicy unrestricted -Command ^
$re = '(?m)^<{LANGB}^>(.*)^<{/LANGB}^>';^
$lang_b_code = ([IO.File]::ReadAllText(^'%0^') -replace $re,'$1');^
echo "${re}";^
echo "Contents: ${lang_b_code}";
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的所有内容都会导致整个文件输出Contents
而不仅仅是标记之间的代码.我已经尝试了不同的方法来转义标记中使用的符号,但它总是导致相同的事情.
注意:使用the ^
是必需的,因为顶级解释器是Batch,它挂在尖括号和其他随机的东西上.
由于只有一个块,您可以使用正则表达式
$re = '(?s)^<{LANGB}^>(.*)^^.*^<{/LANGB}^>';^
Run Code Online (Sandbox Code Playgroud)
但是使用-match
运算符,然后使用$matches[1]
由于设置的变量访问文本-match
.
所以,在正则表达式声明之后,使用
[IO.File]::ReadAllText(^'%0^') -match $re;^
echo $matches[1];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
733 次 |
最近记录: |