【问题标题】:Selection for strings with escaping characters选择带有转义字符的字符串
【发布时间】:2020-01-03 18:50:50
【问题描述】:

以下代码以某种方式执行我想要的操作,除了某些包含\ 的行和另一个问题。我想先澄清一下关于包含\的字符串的错误选择的不便。

$FC=(gc E3.txt)
$L=$FC.length
$SERI=foreach($k in 0..($L-1)) {$FC[$k]}
$list='E4.txt'                        # initially, no content
foreach($x in $SERI){sls -path E0.txt -pattern $x  -CaseSensitive |ac $list}
$SCH=(gc $list).Replace('E0.txt:','') 
clc $list
ac $list $SCH 

下面是这3个文件的内容。

 E3 (input 2)                   E0 (input 1)                           E4 (output)
_ahg                         _ab \> croitre\\                       2:_cnur \> plein\\
_cnur                        _cnur \> plein\\                       4:_cnv \> pratique\\                  
_cnv                         _cho \> cartouche\\                    7:_cob \> plaque\\                  
_co\m u                      _cnv \> pratique\\                     9:_coe \> étang (\!\!: stn: taief)\\
_co\upp m                    _co\m u \> lequel\\                                      
_cob                         _co\upp m \> des morceaux\\                     
_coe                         _cob \> plaque\\                                               
                             _drj \> complet\\                        
                             _coe \> étang (\!\!: stn: taief)\\
                             _coi \> prairie\\                     

我希望选择诸如 _co\m u \> lequel\\ 之类的行,但它们会导致错误语句,如下所示当前行。

sls : La chaîne _co\m u  n’est pas une expression régulière valide : analyse de "_co\m u " - Séquence d'échappement \m non reconnue.
Au caractère Ligne:7 : 20
+ ... ($x in $lt){sls -path E0.txt -pattern $x  - ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument : (:) [Select-String], ArgumentException
+ FullyQualifiedErrorId : InvalidRegex,Microsoft.PowerShell.Commands.SelectStringCommand 

是否可以修改该代码以使其正常工作?

【问题讨论】:

  • $SERI = foreach ($k in 1..$($FC.Count -1)) { [regex]::Escape($FC[$k]) }
  • @JosefZ 似乎工作正常,谢谢;你应该把这个评论变成一个答案,也许有几个解释,这样你就可以得到你的观点。

标签: regex powershell windows-10 escaping select-string


【解决方案1】:

E3.txt 文件包含正则表达式元字符。 以下字符被保留[]().\^$|?*+{}(参见About Regular Expressions)。使用

要么

Select-String 中的-SimpleMatch 参数如下(它会阻止将Pattern 参数的值解释为正则表达式语句):

foreach( $x in $SERI ) {
    Select-String -Path E0.txt -Pattern $x -SimpleMatch -CaseSensitive |
    Add-Content $list
}

[regex]::Escape()静态方法如下:

$SERI = foreach ($k in 1..$($FC.Count -1)) { [regex]::Escape( $FC[$k] ) }

解释请阅读(.NET)Regex Class文章:

Escape(String) method

转义一组最小字符(\、*、+、?、|、{、[、(,)、^、$、 .、# 和空格)通过用它们的转义码替换它们。这 指示正则表达式引擎解释这些字符 字面意思而不是元字符。

例如(参见E3.txt 文件中的第5 行):[regex]::Escape('_co\upp m') 返回_co\\upp\ m

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2015-10-16
    相关资源
    最近更新 更多