如何使用Findstr正则表达式匹配短划线( - )?

时间:2017-02-23 17:42:27

标签: regex batch-file findstr

尝试使用findstr匹配以下格式的文本:

PTB-14
AIR-217

我遇到的问题是,我似乎无法在短划线findstr上匹配-。我在批处理文件中创建了以下脚本:

set dash=-
echo.%dash%
echo !dash! | findstr /i /r /C:- >nul
if errorlevel 1 (
    echo "ERROR!" >&2
    )

我已经使用/C:-/C:"-"/C:"\-"/C:"\\-"尝试了正则表达式。我似乎无法让它匹配。谁知道我做错了什么?

1 个答案:

答案 0 :(得分:2)

实际上不需要使用正则表达式(@Entity @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) public final class Equipment { @JsonCreator public Equipment(String name){ } @JsonProperty("EquipmentName") @JacksonXmlProperty(localName = "eqp:Name") @Setter @Getter private String name; @JsonProperty("EquipmentType") @JacksonXmlProperty(localName = "eqp:Type") @Setter @Getter private String type; } ),但您可以使用文字搜索字符串/R。对于非字母字符,不区分大小写(-)也没有多大意义。

无论如何,我认为您的代码中的问题是您没有启用delayed expansion,尽管您尝试使用它,因此/I实际上与echo !dash!完全相同。

要解决这个问题,有几个选择:

  1. !dash!放在您的代码之前,并(可选)在其后面放置setlocal EnableDelayedExpansion,以便在执行批处理文件的父endlocal实例中启用延迟扩展,例如:

    cmd
  2. 管道setlocal EnableDelayedExpansion set "dash=-" echo(%dash% echo(!dash!| > nul findstr /C:"-" || >&2 echo ERROR^^! endlocal 为任一方启动两个新的|实例,即使是父cmd实例也没有启用延迟扩展。但是,您可以在管道左侧显式启动另一个cmd实例,并启用延迟扩展(cmd):

    /V

    感叹号被转义(set "dash=-" echo(%dash% cmd /V /C echo(^!dash^!| > nul findstr /C:"-" || >&2 echo ERROR! ),以便在那里启用延迟扩展时父级^!实例不会使用它们;如果没有,逃脱不会造成伤害。

  3. 在上面的代码片段中,我另外更改了以下内容:

    • cmd已成为set dash=-,因为这是最安全的语法,可防止意外的尾随空格,甚至可以接受set "dash=-"^,{{ 1}},&()<;
    • >已成为|,这是唯一可靠的语法,虽然看起来很奇怪;
    • 管道echo.前面的 SPACE 已经消失,因为它也会被回显;
    • echo(已替换为条件命令连接运算符|,它允许以下命令仅在发生错误时执行,或者,技术上说,以防上一个命令的退出代码非零;
    • if ErrorLevel 1已更改为||echo "ERROR!" >&2,以避免在{{1}之前使用引号>&2 echo ERROR^^! SPACE 也要回应;如果启用了延迟扩展,则需要>&2 echo ERROR!的双重转义才能显示它;