使用正则表达式和转义双引号将变量通过管道传输到 FINDSTR

2023-12-03

我试图理解发送给我的批处理文件,以便在第三方程序解决问题时解决该错误。基本上,他们正在运行 findstr 正则表达式命令来确定字符串是否匹配。如果是这样,则不应删除的特殊字符将在传递到原始命令行程序之前手动添加回来。

据我所知,所提供的内容不起作用或者我不理解它。我在下面粘贴相关的代码部分。

@echo off
setlocal
set username=%1
shift
echo %username% | findstr /r "^\"[0-9][0-9]*\"" >nul
if not errorlevel 1 (set username=";%username:~0,9%=%username:~10,4%?")
echo %username%

我真正有疑问的三个部分如下:

  1. 我相信上面正则表达式的未转义解释是^"[0-9][0-9]*"我认为这意味着字符串必须begin带有数字字符,然后必须包含零个或多个额外的仅数字字符以便找到匹配项。好吧,FINDSTR 似乎对转义引号做了一些奇怪的事情,我无法让它与我尝试过的任何内容相匹配。如果我删除\" around [0-9][0-9]*然后我可以让它工作,但它不能正确拒绝非数字字符,例如输入字符串123456789O1234(该示例字符串中有一个字母 O 而不是零)。
  2. 重点是什么>nul
  3. 检查错误级别是否等于 0 而不是“不是错误级别 1”不是更好吗,因为它可以可能返回错误级别 2?

无论如何,下面的代码可以工作,但它并不像我想要的那么精确。我只是想了解为什么正则表达式字符串中的引号不起作用。也许这是 FINDSTR 的限制,但我还没有找到任何明确的信息。

@echo off
setlocal
set username=%1
shift
echo %username% | findstr /r "^[0-9][0-9]*" >nul
if not errorlevel 1 (set username=";%username:~0,9%=%username:~10,4%?")
echo %username%

我可以通过重复该类 14 次来解决该问题,因为这是我情况下的字符数(超过 15 个类会导致崩溃- 滚动到底部)。我仍然很好奇如何更简单地实现这一点,当然还有剩下的两个问题。

编辑/工作解决方案

@echo off
setlocal enableDelayedExpansion
set username=%~1
shift
echo !username!|findstr /r /c:"^[0-9][0-9]*$" >nul 
if not errorlevel 1 (set username=";!username:~0,9!=!username:~10,4!?")
echo !username!

NOTES:

  • 当我修改现有代码以使其更类似于 debenhams 后首次运行它时,启用延迟扩展给出了一个错误,就像设置用户名的引号一样(见下文)。我无法复制我做错的事情,但现在一切都正常了(以防其他人遇到同样的问题)。
  • 我曾尝试过$对于 EOL 标记(这是强制它仅匹配数字内容的关键),但我认为其他问题阻碍了我,这让我认为这不是解决方案。另外,为了确保$作品不要错过 dbenham 答案的这一部分“...您还必须确保回显值和管道符号之间没有空格。”
  • 简而言之,尝试在 findstr 的正则表达式中添加双引号似乎是错误的语法/不起作用/等等...除非您实际上希望在正在解析的字符串/文件中匹配 " 。请参阅 dbenham 的答案为了清楚起见,正如他指出的,您可以使用 %~1 从参数中删除引号,而不是将其添加到正则表达式中(并在需要时以编程方式将它们添加回来)。

错误信息

C:>sample.bat 123456789
'enableDelayedExpansion' is not recognized as an internal or external command,
operable program or batch file.
'"' is not recognized as an internal or external command,
operable program or batch file.
!username!

参考链接:

  • Windows FINDSTR 命令未记录的功能和限制
  • findstr 的区分大小写异常(在某些情况下无法正确处理大小写)
  • http://ss64.com/nt/findstr.html
  • http://www.robvanderwoude.com/findstr.php
  • http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/findstr.mspx

以相反的顺序回答你的问题:

3) if not errorlevel 1可能是一样的if %errorlevel%==0因为 IF ERRORLEVEL 1 意味着如果 ERRORLEVEL 大于或等于 1。所以在前面放一个 NOT 意味着如果 ERRORLEVEL 小于 1。我相信 FINDSTR 永远不会返回负 ERRORLEVEL,所以语法应该没问题。

2) The >nul将 FINDSTR 的 stdout 输出重定向到 nul 设备,这意味着它禁用输出。通常任何匹配的行都会被打印。您只对返回代码感兴趣 - 您不想看到输出。

1) 原始正则表达式将匹配以引号开头、后跟至少一个数字、后跟另一个引号的任何输入字符串。它忽略第二个引号后可能出现的任何字符。

因此以下字符串(包括引号)将匹配:

  • "0"
  • "01234"
  • "0"a
  • "01234"a

以下字符串将不匹配:

  • 0
  • 01234
  • ""
  • "0a"

如果匹配字符串中的位数达到一定长度,原始代码就会出现问题,因为结尾引号被删除,导致结束 ) 被引用,因此脚本的其余部分失败。

我不明白你的要求,所以我不知道如何修复代码。

听起来您不想匹配包含非数字的字符串。这意味着您需要在正则表达式的末尾包含行尾标记 $ 。但您还必须确保回显值和管道符号之间没有空格。

我相信您可能不希望在您的值中添加引号(否则您应该以编程方式在最后添加它们)。您可以使用 %~1 从所提供的参数中删除所有括起来的引号。

如果您想检查参数 1 是否只包含数字,那么您可以使用:

setlocal enableDelayedExpansion
set "username=%~1"
echo !username!|findstr /r "^[0-9][0-9]*$" >nul

我使用延迟扩展是因为您无法控制 %1 中包含哪些字符,以及它是否包含 & 或 | 等特殊字符。如果使用普通的扩展就会出现问题。我给出的语法并不是万无一失的,但它可以处理大多数“正常”情况。

在您的情况下没有必要,但我更喜欢使用 /c 选项,以防您的搜索字符串包含空格。所以上面可以写成

echo !username!|findstr /r /c:"^[0-9][0-9]*$" >nul

对我来说,如果原始代码和修改后的代码与您的正则表达式不匹配,则简单地传递用户名,这似乎很奇怪。也许这是您的意图,也许不是。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用正则表达式和转义双引号将变量通过管道传输到 FINDSTR 的相关文章

  • Java:正则表达式 - 如何获取第一个引用文本

    作为初学者regex我相信我要问的事情太简单了 但无论如何我都会问 希望它不会打扰你帮助我 可以说我有这样的文字 你好 cool1 这个词 cool2 我想获取第一个引用的文本 即 cool1 不带 我的模式应该是什么 当使用匹配器时 我如
  • 在 OSX 和 GNU 中使用“find”删除带有数字的文件名

    我正在尝试搜索一个文件并删除名称中包含数字的类似文件 我的文件 txt from myfile 00 04 version txt myfile 00 txt find E iregex myfile 0 9 1 txt 删除 myfile
  • 以任意顺序匹配可选捕获组

    在解析用户输入的许多情况下 用户有机会向输入添加几个可选标志 这些标志应该以任何顺序接受 如何使用正则表达式对其进行解析 以便每个标志都位于它自己的捕获组中 如果存在 例如 有一个必需的令牌a 然后是 3 个可选标记 可以按任何顺序出现b
  • 正则表达式从字符串中提取 IP 和端口

    我正在使用 Perl 尝试从字符串中提取 IP 地址和端口 我尝试使用的正则表达式是 s sip 字符串是 sip 255 255 255 255 8080 transport TCP sip 255 255 255 255 8080 显然
  • 如何从 HTA 中启动批处理文件

    我有一个基本的 HTA 其中我尝试通过按钮启动批处理文件 但是当我尝试启动批处理文件时 它不会运行 当我按下按钮时 将启动命令提示符窗口 但不会运行脚本 这是代码的简单示例
  • 使用 sed 删除非字母数字字符

    我正在尝试验证一些输入以删除一组字符 只允许使用字母数字字符加 句点 下划线 连字符 我测试了正则表达式 w here http gskinner com RegExr http gskinner com RegExr 它与我想要删除的内容
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • 正则表达式将单词的开头和结尾与元音匹配

    我正在尝试以下操作Regex aeiou aeiou 但它不起作用 我测试了 abcda 并且不匹配 它应该只是 aeiou aeiou 额外的 您需要第二个字符是一个文字点 例如 a hello 但由于您的测试用例 abcda 不包含这样
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • php 或 zend 中国际电话号码验证的正则表达式是什么?

    我有一个 zend 表单 其中有一个电话号码字段 并且必须检查验证器 我决定为此使用正则表达式 我搜索了谷歌 但我得到的结果不起作用 谁能给我提供正则表达式 这是我的代码 phone new Zend Form Element Text p
  • 正则表达式验证字符串是否包含三个非空白字符

    我使用欧芹 js 来验证输入 并且使用 data parsley pattern 它允许我传递正则表达式 我正在尝试验证该字符串以确保它至少包含三个非空白字符 下面是应该无效或有效的字符串 valid 1 2 b invalid 1 b s
  • PHP URL 验证

    我知道有无数的线程问这个问题 但我一直无法找到一个可以帮助我解决这个问题的线程 我基本上试图解析大约 10 000 000 个 URL 的列表 确保它们根据以下标准有效 然后获取根域 URL 此列表包含您能想象到的几乎所有内容 包括类似的内
  • 比较批处理文件中的两个数字

    我在这个网站上搜索了我的问题 但没有找到解决我问题的方法 系统为玩家和计算机提供一个从 2 到 12 的随机数 这有 3 部分 X 大于 Y 如果 X 小于 Y 以及当 X 与 Y 相同 当我开始 bat 效果很好 我选择Play Game
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • 如何检查号码是否是巴基斯坦用户的手机号码而不是固定电话号码

    我所做的是从开头删除 92 或 0092 并使用以下代码检查它是否是巴基斯坦人的有效手机号码 if preg match 3 0 4 0 9 number 1 Pakistani mobile number else not a pakis
  • PHP解析xml文件错误

    我正在尝试使用 simpleXML 来获取数据http rates fxcm com RatesXML http rates fxcm com RatesXML Using simplexml load file 我有时会遇到错误 因为这个
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • 从正则表达式对象中提取允许字符串的最大长度

    一旦加载到 C 中 是否可以从正则表达式模式中提取允许的字符串的最大长度Regex object 如果我有一个正则表达式字符串定义为 A Z0 9 0 20 我可以使用字符串操作来获取最大允许长度20 但是 有没有一种方法可以更轻松地实现这
  • 正则表达式:无法找出与单个事件匹配的表达式,并且仅匹配包含特定单词的行

    我正在尝试使用 Sublime Text 作为编辑器清理并合并一些旧的日历文件 x ics 打开文件会得到一个长文件 如下所示 我想删除 即替换为任何内容 文件中在摘要中提及生日的所有条目 VEVENT 并保留所有其他条目 因此我使用正则表
  • Golang 正则表达式在字符串之间替换

    我有一些可能采用以下形式的字符串 MYSTRING MYSTRING n MYSTRING n MYSTRING randomstringwithvariablelength n 我希望能够将其正则表达式为MYSTRING foo 基本上替

随机推荐

  • 按平均值排名的箱线图

    我想显示多个变量的箱线图 并按列均值降序排列它们 就像在绩效分析包裹 我使用以下代码生成箱线图 zx lt replicate 5 rnorm 50 zx means lt colMeans zx na rm TRUE boxplot zx
  • django 和 facebook:代表用户执行第三方登录的 facebook web 应用程序的安全性和设计

    我正在编写一个 Facebook 画布 Web 应用程序 它执行对第三方网站的登录 使用 urllib 并代表用户执行操作 这意味着我有2个账户 用户在我的网络应用程序中拥有的帐户 通过 facebook 以及应用程序用来代表他们执行登录的
  • Android Parcelable 对象返回 Null

    我有产品类 我想将产品对象从一项活动传递到另一项活动 我已经这样实现了 public class Product implements Parcelable private double availableQuantity private
  • 函数修改列表

    def make Ab A b n len A Ab list A for index in range 0 n Ab index append b index 0 print A return Ab copy A 0 0 1 0 1 0
  • VSCode 片段触发器之前有文本吗?

    我想在 VSCode 中创建一个显示 PHP 箭头的代码片段 当我按 键然后按 TAB 键时 我想要 PHP 箭头 gt 这是我的代码片段 PHP arrow prefix body gt 0 description PHP Arrow g
  • R - 将数据帧转换为格式为 featureName:featureValue [重复] 的数据集

    这个问题在这里已经有答案了 原来我想要的格式叫 SVM 轻 并在这里描述http svmlight joachims org 我有一个数据框 我想将其转换为格式如下的文本文件 output featureIndex featureValue
  • 无法在子进程命令中使用 grep

    我的子进程命令有问题 我喜欢 grep 出与 Online 行匹配的行 def run command command p subprocess Popen command shell False stdout subprocess PIP
  • 如何处理 tokio::spawn 闭包需要“static”和“&self”?

    我无法理解如何编写封装在一个结构中的并发异步代码 我不确定如何准确解释这个问题 所以我会尝试用一个例子来解释 假设我有一个UdpServer结构 该结构有多个与其行为相关的方法 例如 handle datagram deserialize
  • 我们是否忽略补码的溢出

    我试图解决二进制补码内的溢出问题 例如说我试图去掉这两个二进制数 1111 1000 0100 010 111 001 000 我将第二个二进制数转换为两个补码等值 然后简单地将其相加 但我注意到它导致了 1 的溢出 我是否只是忽略溢出 或
  • 未找到 Python 模块,但该模块存在于文件夹中

    我正在尝试执行一个简单的 PY 文件 但收到以下错误 Traceback most recent call last File docker pull py line 8 in
  • Python 中可能存在混合缩进吗?

    看着this问题 我在我的机器上尝试了OP的代码 这里有一个文字版和截图 刚刚发生了什么 这应该是一个square功能 并且已正确实现 可以肯定的是 我复制粘贴了代码 然后再次尝试 好吧 我看不出这些版本之间有什么区别square 但只有后
  • 使用 clusplot 绘制以 0 为中心坐标的聚类

    我正在尝试绘制 GIS 坐标 特别是东向和北向相似的英国国家网格坐标 194630000 562220000 我可以使用 Cluster 库中的 clusplot 绘制这些图 clusplot df2 k means fit cluster
  • Javascript 函数生成具有非均匀概率的随机整数

    在javascript 或jquery 中 有一个简单的函数可以计算四个整数及其概率值 1 0 41 2 0 29 3 0 25 4 0 05 我怎样才能生成这四个数字并考虑到它们的概率 这个问题与这里发布的问题非常相似 生成具有概率的随机
  • php 5.3.1 的 phpinfo() 中未启用 mysql

    我在 Vista 上安装了 apache 2 2 14 php 5 3 1 和 mysql 5 1 43 两天以来我一直在尝试配置 php 以在 phpinfo 上启用 mysql 我修改了 php ini 使其具有 extension d
  • 惰性类属性装饰器

    我有一个 Django 模型 需要对自定义用户模型进行一些处理 我无法在类加载时使用该模型的类 因为类的加载顺序未知 所以我需要在运行时添加一些类属性 目前我将它们添加到 init or new like def new cls args
  • SQL Server 对浮点字段“like”会产生不一致的结果

    我在用LIKE返回针对浮点字段的匹配数字结果 似乎一旦小数点左侧超过 4 位 则不会返回与我的小数点右侧搜索项匹配的值 下面是一个说明这种情况的示例 CREATE TABLE number like test num FLOAT NULL
  • 使用 ord 和 chr 移动字母

    我正在尝试执行一个函数 将每个单词中的每个字母按值向右移动 这些单词将来自一个列表 我将使用 打开 功能打开它 我写了代码 我在这里面临一些困难 这是我的代码 def test value eval input Value here wit
  • 模板化友元函数查找

    下面的简单代码可以很好地编译 class A int x 3 public A x 0 1 x 1 2 x 2 3 friend int const at A const a unsigned i noexcept return a x i
  • 为什么下面的函数被调用三次

    我曾尝试调试 但没有运气 我无法理解为什么第二个 printf 调用increment 三次 但第一个按预期调用两次 include
  • 使用正则表达式和转义双引号将变量通过管道传输到 FINDSTR

    我试图理解发送给我的批处理文件 以便在第三方程序解决问题时解决该错误 基本上 他们正在运行 findstr 正则表达式命令来确定字符串是否匹配 如果是这样 则不应删除的特殊字符将在传递到原始命令行程序之前手动添加回来 据我所知 所提供的内容