【问题标题】:How to match command-like arguments using regex (C#)如何使用正则表达式(C#)匹配类似命令的参数
【发布时间】:2020-10-21 23:03:23
【问题描述】:

我正在尝试为我正在编码的搜索命令解析过滤器。用户可以使用一个或多个参数进行搜索。值可以有空格(如果有,必须用双引号括起来)。另外,我已经声明了几个“运算符”,它们是:=(用于等于)、:=(用于开头)、=:(用于结尾)和*(用于包含)。

例如:

name=John name:="John Doe" name*"ohn Do"

必须匹配:name=Johnname*"John Doe"name*"ohn Do"

我尝试过使用正则表达式 (C#),但是当它不包含引号时它不会匹配字符串。到目前为止,这是我想出的:

Regex.Matches(input, "(name(=|:=|=:|\\*)([^\"](\\S+)) | (name(=|:=|=:|\\*)\"([^\"]*)\"))", RegexOptions.IgnoreCase);

这基本上匹配单词“name”,后跟一个运算符,后跟一个空格,或者相同但直到结束双引号。但它不匹配任何东西。
实际上,我用foreach 中的几个关键字替换了“name”,但为了简单起见,我们只匹配“name”这个词。

无论如何,有什么想法我可能做错了吗?

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    主要问题是您的 |-operator 和捕获组之间有空格,删除这些空格会使您的正则表达式成功匹配您的示例。 当引号内使用更多空格或在您的自定义运算符之一之后使用多个空格时,您的正则表达式将失败。

    Regex.Match(input, @"(?:name(=|:=|=:|\*)((?:"(?:[\w\s]*)")|(?:[^"\s]*)))", RegexOptions.IgnoreCase);
    

    无论空格如何,该表达式都应该可以工作,并为您提供使用的自定义运算符和匹配的输入,如果输入以引号开始和结束,您必须自己为该特定表达式清理输入。 我已经在引号内和运算符之间使用多个空格测试了这个表达式,它的行为符合我的预期,我没有检查任何其他内容,所以请注意这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2022-11-16
      相关资源
      最近更新 更多