Выражение регулярных выражений работает, кроме как в dotNet - PullRequest
0 голосов
/ 04 апреля 2010

Я пытаюсь сопоставить выражение типа

field:"value"

но не

field:value

Я написал

([a-z]+)\s*?:\s*?"(.+)"\s*?

и это работает за исключением dotNet

Есть ли причина, по которой это может быть? Что-то мне не хватает?

Редактировать - я набрал вопрос неправильно (цифры)

Я пытаюсь соответствовать

field:value 

но не

field:"value"

Это регулярное выражение, которое у меня есть

(?<field>[a-z]+)\s*?:\s*?(?<value>[^"].+[^"])\s*?

Но это не работает, оно совпадает даже с тем, что в кавычках.

Редактировать 2:

Ниже приведен код - SearchResources.StringRegexNotQuotedText это ([a-z]+)\s*?:\s*?([^"]+)\s*? stringQuery is (what: "Hello_bob")

Все соответствующие вещи сбежали ....

Regex regexNotQuoted = new Regex(SearchResources.StringRegexNotQuotedText, RegexOptions.IgnoreCase);

MatchCollection matchesNotQuoted = regexNotQuoted.Matches(stringQuery);

 // It should go into this block if the value is not in quotes
 if (regexNotQuoted.IsMatch(stringQuery))
 {

 }

Ответы [ 3 ]

1 голос
/ 04 апреля 2010

Эта часть: [^"].+ означает: символ, отличный от двойных кавычек, за которым следует один или несколько символов . Это означает, что вы сопоставляете только последовательности не менее двух символов, которые начинаются с двойных кавычек. Вы, вероятно, хотите [^"].*, то есть последовательности по крайней мере один символ, который не является двойной кавычкой;

Теперь к вопросу. Вы получаете совпадение из-за этой части \s*?([^"].+[^"]). Часть \s*? не будет соответствовать пробелам, потому что она не жадная (вот что означает знак вопроса). Тогда часть [^"] будет соответствовать пробелу, .+ будет соответствовать "Hello_bo, а последняя [^"] будет соответствовать финалу b. Остальная часть строки (") не будет захвачена.

Вам нужно прекратить использовать не жадные операторы (это почти никогда не то, что вам нужно) и убедиться, что вы захватываете все до конца строки, используя привязку конца строки: $.

Итак, вот что я рекомендую вам использовать:

(?<field>[a-z]+)\s*:\s*(?<value>[^"].*[^"])\s*$

С этим кодом C #:

Regex re = new Regex(@"(?<field>[a-z]+)\s*:\s*(?<value>[^""].*[^""])\s*$");
1 голос
/ 04 апреля 2010

Звучит так, как будто вы хотите сопоставить один или несколько символов, кроме двойных кавычек или пробелов, поэтому напишите это так:

[^"\s]+

Полное регулярное выражение будет:

(?<field>[a-z]+)\s*:\s*(?<value>[^"\s]+)
0 голосов
/ 04 апреля 2010

у меня работает. Вот код, который я использовал:

resultString = Regex.Match(subjectString, @"([a-z]+)\s*?:\s*?""(.+)""\s*?", RegexOptions.Singleline | RegexOptions.IgnoreCase).Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...