javascript regex: почему существует пространство в & ldquo; x {n, m} & rdquo; приведет к ошибке? [dубликат]

Я бы использовал регулярные выражения, так как вы не всегда можете использовать Linq для SQL.

Как этот пример Linq to Objects

  List & lt; string & gt;  list = new List & lt; string & gt; ();  list.Add ("Это предложение.");  list.Add («Это еще один»);  list.Add («C # - забава»);  list.Add («Linq также забава»);  System.Text.RegularExpressions.Regex regEx = new System.Text.RegularExpressions.Regex ("This");  var qry = list .Where & lt; string & gt; (item = & gt; regEx.IsMatch (item)) .ToList & lt; string & gt; ();  // Печать результатов foreach (элемент var в qry) {Console.WriteLine (item);  }  
2
задан user225312 12 February 2011 в 16:11
поделиться

6 ответов

Вы не должны помещать пробел после запятой, а {1} является избыточным.

9
ответ дан Mike Samuel 16 August 2018 в 03:32
поделиться
  • 1
    Я принял ваш ответ, так как он упомянул также часть {1} . Благодарю. – user225312 12 February 2011 в 16:26

Вы можете скомпилировать регулярное выражение с флажком VERBOSE, это означает, что большинство пробелов в регулярном выражении будут игнорироваться. Я думаю, что это очень хорошая практика для описания сложных регулярных выражений более читаемым образом.

Подробнее см. [D0] здесь ...

Надеемся, что это поможет ...

1
ответ дан Gowtham 16 August 2018 в 03:32
поделиться
  • 1
    +1 для вершинного наконечника флага. – arthurprs 12 February 2011 в 16:50
  • 2
    -1 Во-первых, «все пробелы в регулярном выражении будут проигнорированы», - это совершенно неверно; буквальное пространство может быть включено путем выполнения, например, [] . Во-вторых, регулярное выражение OP не начинает вести себя так, как ожидалось, просто используя флаг VERBOSE; его регулярное выражение должно измениться - см. мой ответ. – John Machin 12 February 2011 в 21:30
  • 3
    @John: спасибо, что указали ошибку и спасибо за отчет об ошибке тоже ... Я отредактировал свой ответ. – Gowtham 13 February 2011 в 12:04

Попробуйте

  p = re.compile ('a {1} b {1,3}')  

... и учтите пространство.

6
ответ дан Jim Brissom 16 August 2018 в 03:32
поделиться
  • 1
    Ничего себе, я бы никогда не думал, что это может вызвать проблемы. – user225312 12 February 2011 в 16:14

Вы видите поведение re , которое очень «темное», почти на ошибке (или два).

  # Python 2.7.1 & gt;  & GT; & GT;  import & gt; & gt; & gt; & gt; & gt; & gt;  pat = r "b {1, 3} \ Z" & gt; & gt; & gt;  bool (re.match (pat, "bb")) False & gt; & gt; & gt; & gt; & gt;  bool (re.match (pat, "b {1, 3}")) True & gt; & gt; & gt; & gt; & gt;  bool (re.match (pat, "bb", re.VERBOSE)) False & gt; & gt; & gt; & gt; & gt;  bool (re.match (pat, "b {1, 3}", re.VERBOSE)) False & gt; & gt; & gt; & gt; & gt; & gt;  bool (re.match (pat, "b {1,3}", re.VERBOSE)) True & gt; & gt; & gt; & gt; & gt; & gt;   

Другими словами, шаблон "b {1, 3}" соответствует буквальному тексту "b {1, 3}" в нормальном режиме и буквальный текст "b {1,3}" в режиме VERBOSE.

«Закон наименьшего удивления» предполагает либо (1) пространство перед 3 был проигнорирован, и он соответствовал "b" , "bb" или "bbb" в случае необходимости [предпочтительнее] или (2) исключение во время компиляции.

Взгляд на него по-другому: две возможности: (a) Человек, который пишет «{1, 3}» пронизана духом PEP8 и полагает, что он предписывающий и применяется повсюду. (б) Человек, который пишет, что протестировал re недокументированное поведение и фактически хочет сопоставить литеральный текст "b {1, 3} " и извратно хочет использовать r" b {1, 3} " вместо явного экранирования: r" b \ {1, 3} "[ ! d14]. Мне кажется, что (а) гораздо вероятнее, чем (б), и re должны действовать соответственно.

Еще одна перспектива: когда пространство достигнуто, оно уже разобралось {, строка цифр и запятая, т.е. хорошо в {m, n} "оператор" ... молча игнорировать неожиданный символ и рассматривать его как бы это был буквальный текст ошеломляющий, perlish и т. д.

Обновить Сообщение об ошибке подано.

3
ответ дан John Machin 16 August 2018 в 03:32
поделиться

Не вставляйте пробелы между { и } .

  p = re.compile ('a {1} b {1  , 3} ')  
2
ответ дан Juliano 16 August 2018 в 03:32
поделиться

Удалите лишние пробелы в b .

Изменить:

  p = re.compile ('a {1} b {1  , 3} ')  

to:

  p = re.compile (' a {1} b {1,3} ') ^ # no  whitespace  

, и все должно быть хорошо.

3
ответ дан user225312 16 August 2018 в 03:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: