尝试使用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:"\\-"
尝试了正则表达式。我似乎无法让它匹配。谁知道我做错了什么?
答案 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!
完全相同。
要解决这个问题,有几个选择:
将!dash!
放在您的代码之前,并(可选)在其后面放置setlocal EnableDelayedExpansion
,以便在执行批处理文件的父endlocal
实例中启用延迟扩展,例如:
cmd
管道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!
),以便在那里启用延迟扩展时父级^!
实例不会使用它们;如果没有,逃脱不会造成伤害。
在上面的代码片段中,我另外更改了以下内容:
cmd
已成为set dash=-
,因为这是最安全的语法,可防止意外的尾随空格,甚至可以接受set "dash=-"
,^
,{{ 1}},&
,(
,)
和<
; >
已成为|
,这是唯一可靠的语法,虽然看起来很奇怪; echo.
前面的 SPACE 已经消失,因为它也会被回显; echo(
已替换为条件命令连接运算符|
,它允许以下命令仅在发生错误时执行,或者,技术上说,以防上一个命令的退出代码非零; if ErrorLevel 1
已更改为||
或echo "ERROR!" >&2
,以避免在{{1}之前使用引号>&2 echo ERROR^^!
和 SPACE 也要回应;如果启用了延迟扩展,则需要>&2 echo ERROR!
的双重转义才能显示它;