Regex для разбору простага OData запыту

Я спрабую стварыць рэгулярны выраз для разбору наступных 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'

У асноўным гэта OData радкі запыту, названыя ў $ фільтра . Звярніце ўвагу, што гэта за прадастаўленне абмежаваную падтрымку OData і, такім чынам, прыклад радкі маюць толькі <�моцны> ек і <�моцны> і .

Гэта тое, што я да гэтага часу

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

This works for the most part except that when I have a space in a quoted string such as 'United States' (note the space between United and States), it picks up only 'United

Я паспрабаваў дадаць \ S ў дыяпазоне сімвалаў, каб захапіць як так

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

but this throws the captured groups out of whack since the string itself can contain spaces to separate the name and value (Value eq 1234) <-- Note the spaces separating the Value and eq

Любое кіраўніцтва ў фіксацыі/узнаўленні рэгулярны выраз вышэй будзе самай высокай ацэнкі.

UPDATE: Я таксама павінен падтрымліваць дадатковыя аперацыі фільтрацыі, такія як ( «або», «StartsWith», «EndsWith», «substringof»).

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

0
@NeverHopeless: Я меў на ўвазе, два прыкладу і, такім чынам, «якое адсутнічае» і :-)
дададзена аўтар Abhijeet Patel, крыніца
@NeverHopeless: Я меў на ўвазе, два прыкладу і, такім чынам, «якое адсутнічае» і :-)
дададзена аўтар Abhijeet Patel, крыніца
@Jim: рашэнне Anurudh з'яўляецца скала. Я выкарыстоўваю яго на працягу апошніх 2-х месяцаў, і гэта працуе добра. Я хацеў бы прадставіць вам неабходнасці разабраць OData запыты ў службу REST? Калі гэта так, што рамкі/тэхналогіі вы карыстаецеся?
дададзена аўтар Abhijeet Patel, крыніца
@Jim: рашэнне Anurudh з'яўляецца скала. Я выкарыстоўваю яго на працягу апошніх 2-х месяцаў, і гэта працуе добра. Я хацеў бы прадставіць вам неабходнасці разабраць OData запыты ў службу REST? Калі гэта так, што рамкі/тэхналогіі вы карыстаецеся?
дададзена аўтар Abhijeet Patel, крыніца
яна не павінна быць: Краіна ек «ЗША» і 1234.45M і CreatedOn Value ек ек '2013-06-05T06: 04: 23.2111146Z і Значэнне ек 1234.45M і статус ек "Актыўны" і CategoryID экв 1 і Краіна ек «ЗША»
дададзена аўтар NeverHopeless, крыніца
так ці маё рашэнне дапамагае?
дададзена аўтар NeverHopeless, крыніца
так ці маё рашэнне дапамагае?
дададзена аўтар NeverHopeless, крыніца
Вы паказалі, што б праверыць розныя рашэнні і далажыць аб якіх адзін быў найбольш правільным. Гэта не здаецца, што ты вярнуўся і адзначыў свой адказ, я хацеў бы ведаць, што вы знайшлі, так як я вырашаць тую ж праблему.
дададзена аўтар Jim Wooley, крыніца
Вы паказалі, што б праверыць розныя рашэнні і далажыць аб якіх адзін быў найбольш правільным. Гэта не здаецца, што ты вярнуўся і адзначыў свой адказ, я хацеў бы ведаць, што вы знайшлі, так як я вырашаць тую ж праблему.
дададзена аўтар Jim Wooley, крыніца

7 адказы

Вы можаце параўнаць яго з гэтым рэгулярным выразам

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

Ваш код будзе

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

Now you can iterate over lst

foreach(var v in lst)
{
    v.name;
    v.value;
}
2
дададзена
Ніца. Гэта, здаецца, працуе вельмі добра. Дзякуй за ваша рашэнне. Я стукнуў яго з кучай тэстаў і паведаміць тут
дададзена аўтар Abhijeet Patel, крыніца
Падзяку за Regex гэта працуе вельмі добра да гэтага часу. Я таксама павінен падтрымліваць некаторыя дадатковыя аперацыі фільтрацыі, такія як «або», «StartsWith», «EndsWith», «» substringof Прыклад: $ фільтр = Краіна ек «ЗША» і Value ек 1234.45M і substringof ( «Alfrēds», CompanyName ) ек сапраўдным або StartsWith (CompanyName, «álfr») і EndsWith (CompanyName, «Futterkiste») вы былі б у стане абнавіць свой адказ, каб уключыць падтрымку гэтых?
дададзена аўтар Abhijeet Patel, крыніца

Вы можаце параўнаць яго з гэтым рэгулярным выразам

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

Ваш код будзе

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

Now you can iterate over lst

foreach(var v in lst)
{
    v.name;
    v.value;
}
2
дададзена
Ніца. Гэта, здаецца, працуе вельмі добра. Дзякуй за ваша рашэнне. Я стукнуў яго з кучай тэстаў і паведаміць тут
дададзена аўтар Abhijeet Patel, крыніца
Падзяку за Regex гэта працуе вельмі добра да гэтага часу. Я таксама павінен падтрымліваць некаторыя дадатковыя аперацыі фільтрацыі, такія як «або», «StartsWith», «EndsWith», «» substringof Прыклад: $ фільтр = Краіна ек «ЗША» і Value ек 1234.45M і substringof ( «Alfrēds», CompanyName ) ек сапраўдным або StartsWith (CompanyName, «álfr») і EndsWith (CompanyName, «Futterkiste») вы былі б у стане абнавіць свой адказ, каб уключыць падтрымку гэтых?
дададзена аўтар Abhijeet Patel, крыніца

Паспрабуйце выкарыстоўваць гэта рэгулярны выраз:

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

Паглядзіце на прыклад .

Я чакаю, памылка друку ў вашых дадзеных ўзору:

<�Р> Краіна ек «ЗША» і Value ек 1234.45M і CreatedOn экв   '2013-06-05T06: 04: 23.2111146Z <�моцны> і Значэнне ек 1234.45M і статус   ек "Актыўны" і CategoryID экв 1 і Краіна ек «ЗША»
1
дададзена
Гэта сапраўды дапамагае. Дзякуй за ваша рашэнне. Я спрабуючы ўсе рэгулярныя выразы, размешчаныя тут, і падвяргаючы іх да батарэі тэстаў, каб гарантаваць, што кут справы разглядаюцца. Я адзначыць пераможца ў якасці адказу
дададзена аўтар Abhijeet Patel, крыніца

Паспрабуйце выкарыстоўваць гэта рэгулярны выраз:

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

Паглядзіце на прыклад .

Я чакаю, памылка друку ў вашых дадзеных ўзору:

<�Р> Краіна ек «ЗША» і Value ек 1234.45M і CreatedOn экв   '2013-06-05T06: 04: 23.2111146Z <�моцны> і Значэнне ек 1234.45M і статус   ек "Актыўны" і CategoryID экв 1 і Краіна ек «ЗША»
1
дададзена
Гэта сапраўды дапамагае. Дзякуй за ваша рашэнне. Я спрабуючы ўсе рэгулярныя выразы, размешчаныя тут, і падвяргаючы іх да батарэі тэстаў, каб гарантаваць, што кут справы разглядаюцца. Я адзначыць пераможца ў якасці адказу
дададзена аўтар Abhijeet Patel, крыніца

Я думаю, што вы павінны зрабіць гэта ў двух частках (Выбачайце за псевдокод, пытанне было ў самым пачатку ў цэлым, і я не .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
', $s); }
0
дададзена

Калі ласка, паспрабуйце гэта рэгулярны выраз:

(\w+)\seq\s\'?([^\']+)\'?
0
дададзена

Калі ласка, паспрабуйце гэта рэгулярны выраз:

(\w+)\seq\s\'?([^\']+)\'?
0
дададзена