1

我正在尝试创建一个正则表达式来解析以下 2 个字符串

Country eq 'United States' and Value eq 1234.45M and CreatedOn eq '2013-06-05T06:04:23.2111146Z'
Value eq 1234.45M and Status eq 'Active' and CategoryID eq 1 and Country eq 'United States'

基本上这些是$filter中指定的 OData 查询字符串。请注意,这是为了提供有限的 Odata 支持,因此示例字符串只有eqand

这是我到目前为止所拥有的

(\w+)\seq\s\'{0,1}([0-9a-zA-Z,*=@#$&()-_+=!]*)\'{0,1}

这在大多数情况下都有效,除了当我在引号字符串中有一个空格时,例如“美国”(注意美国和美国之间的空格),它只拾取“美国”

我尝试将 \s 添加到要捕获的字符范围中

(\w+)\seq\s\'{0,1}([0-9a-zA-Z,*\s=@#$&()-_+=!]*)\'{0,1}

但这会使捕获的组失控,因为字符串本身可以包含空格来分隔名称和值(Value eq 1234)<-请注意分隔Valueeq的空格

任何有关修复/重新创建上述正则表达式的指导将不胜感激。

更新:我还需要支持额外的过滤操作,例如('or','startswith','endswith','substringof')。

示例: $filter = Country eq 'United States' and Value eq 1234.45M and substringof('Alfreds', CompanyName) eq true or startswith(CompanyName, 'Alfr') and endswith(CompanyName, 'Futterkiste')

4

4 回答 4

2

您可以将其与此正则表达式匹配

(\w+)\s*eq\s*'?([^']*)'?(?=\s*and|$)

你的代码是

var lst=Regex.Matches(input,regex)
                      .Cast<Match>()
                      .Select(x=>
                            new
                             {
                                 name=x.Groups[1].Value,
                                 value=x.Groups[2].Value
                             });

现在你可以迭代lst

foreach(var v in lst)
{
    v.name;
    v.value;
}
于 2013-06-05T06:23:08.830 回答
1

尝试使用这个正则表达式:

(\w+\seq\s'?[\w\s\.\:\-]+'?)(?= and |$)

在此处查找示例。

我预计您的示例数据中有错字:

国家 eq 'United States' 和 Value eq 1234.45M 和 CreatedOn eq '2013-06-05T06:04:23.2111146Z' Value eq 1234.45M 和 Status eq 'Active' 和 CategoryID eq 1 和 Country eq 'United States'

于 2013-06-05T08:41:12.967 回答
0

请试试这个正则表达式:

(\w+)\seq\s\'?([^\']+)\'?
于 2013-06-05T06:26:00.300 回答
0

我认为您应该分两部分执行此操作(对不起,伪代码,问题一般在一开始,我不是.net 人(但我在 php 中对其进行了测试)):

input = "Country eq 'United States' and Value eq 1234.45M and CreatedOn eq '2013-06-05T06:04:23.2111146Z'"
splitted = split ("and", input);

然后做我认为是替换的事情(因为捕获组):

foreach (splitted as s) {
    print (regex.replace ("#(\w+)\seq\s(.*)\s?$#", '$1 = $2', s));
}

如果 php 比我的伪代码更容易理解,这里是代码:

$string = "Country eq 'United States' and Value eq 1234.45M and CreatedOn eq '2013-06-05T06:04:23.2111146Z'";
$splitted = explode ('and', $string);

$regex = "#(\w+)\seq\s(.*)\s?$#";
foreach ($splitted as $s) {
    echo preg_replace ($regex, '$1 = $2<br />', $s);
}
于 2013-06-05T06:41:08.880 回答