sub для извлечения данных и разделения столбца кадра данных [duplicate]

TL; DR: Попробуйте использовать Html.Partial вместо Renderpage


Я получал Object reference not set to an instance of an object, когда пытался сделать вид в представлении, отправив ему модель, например это:

@{
    MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null

Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:

@{
    MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);

И это сработало.

Кроме того, причина, по которой я не имел Html.Partial для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach, хотя это не ошибка:

@inherits System.Web.Mvc.WebViewPage
@{
    ViewBag.Title = "Entity Index";
    List<MyEntity> MyEntities = new List<MyEntity>();
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
}
<div>
    @{
        foreach(var M in MyEntities)
        {
            // Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
            @Html.Partial("MyOtherView.cshtml");
        }
    }
</div>

Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach, чтобы выглядеть так:

@foreach(var M in MyEntities){
    ...
}

Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .

269
задан ObiWanKenobi 8 March 2010 в 18:20
поделиться

7 ответов

Вы можете использовать следующее regex глобально:

\[(.*?)\]

Объяснение:

  • \[: [ является метасимволом, и его необходимо экранировать, если вы хотите сопоставить это буквально.
  • (.*?): совпадение со всем нежелательным способом и захват его.
  • \]: ] является метасимволом и требует чтобы ускользнуть, если вы хотите совместить это буквально.
529
ответ дан codaddict 25 August 2018 в 00:37
поделиться
  • 1
    Другой метод ответа, используя [^]], быстрее, чем не жадный (?), а также работает с ароматами регулярных выражений, которые не поддерживают не жадные. Однако не жадный выглядит лучше. – Ipsquiggle 8 March 2010 в 18:24
  • 2
    @Ipsquiggle, вы правы сэр :) – StErMi 30 June 2012 в 10:49
  • 3
    Как исключить [ ] из вывода (результата)? – Mickey Tin 28 April 2013 в 23:46
  • 4
    @MickeyTin, если вы используете Java, вы можете сгруппировать его с помощью группы (1) поверх группы (), поэтому '[]' не будет идти вместе – abyteneverlie 19 September 2013 в 17:47
  • 5
    Это соответствует только первому вхождению – hfatahi 6 August 2015 в 14:43

(?<=\().*?(?=\)) работает хорошо в соответствии с приведенным выше объяснением. Вот пример Python:

import re 
str =    "Pagination.go('formPagination_bottom',2,'Page',true,'1',null,'2013')"
re.search('(?<=\().*?(?=\))', str).group()
"'formPagination_bottom',2,'Page',true,'1',null,'2013'"
8
ответ дан Alan Moore 25 August 2018 в 00:37
поделиться
  • 1
    Вы всегда должны использовать форматирование кода для регулярных выражений, где бы они ни появлялись. Если регулярное выражение находится в тексте, а не в блоке кода, вы можете использовать обратные ссылки для их форматирования. ( исх [/ д0]) – Alan Moore 24 April 2015 в 01:28
  • 2
    Кроме того, вопрос касался квадратных скобок ([]), а не круглых скобок. – Alan Moore 24 April 2015 в 01:32

Это должно работать нормально:

\[([^]]+)\]
73
ответ дан jasonbar 25 August 2018 в 00:37
поделиться
  • 1
    В моем случае использования текст в квадратных скобках может содержать новые строки, и это регулярное выражение работает, а принятый ответ - нет. – Dave 8 June 2013 в 05:59
  • 2
    что означает класс символов [^]]? С чем это связано? – Richard 15 September 2013 в 14:25
  • 3
    @Richard, The ^ отрицает класс символов. Это означает «любой символ, который не является» & quot ;. – jasonbar 16 September 2013 в 13:46
  • 4
    Я думаю, что это не работает должным образом, вы должны использовать \[([^\[\]]*)\], чтобы получить контент в самой внутренней скобке. Если вы посмотрите на lfjlksd [ded[ee]22], то \[([^]]+)\] вы получите [ded[ee], в то время как предлагаемое выражение вернет [ee]. тестируется в ссылке – TMC 2 April 2014 в 15:45
  • 5
    Можете ли вы предоставить примеры «sed» и «awk», чтобы использовать это регулярное выражение и извлечь текст. Благодарю. – valentt 17 July 2015 в 14:37

Этот код будет извлекать содержимое между квадратными скобками и круглыми скобками

(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\]))

(?: non capturing group
(?<=\().+?(?=\)) positive lookbehind and lookahead to extract the text between parentheses
| or
(?<=\[).+?(?=\]) positive lookbehind and lookahead to extract the text between square brackets
3
ответ дан Nezar Fadle 25 August 2018 в 00:37
поделиться
(?<=\[).+?(?=\])

будет захватывать контент без скобок

(? & lt; = [) - положительный lookbehind для [

. *? - нежелательное соответствие для содержимого

(? =]) - положительный результат для]

EDIT: для вложенных скобок должно выполняться следующее регулярное выражение:

(\[(?:\[??[^\[]*?\]))
51
ответ дан Nicolas Labrot 25 August 2018 в 00:37
поделиться
  • 1
    @igaurav Я проверил его, и он работает. Однако он не будет работать в средах, которые не поддерживают lookbehinds как Javascript. Может, это ваш случай? – Adam Moszczyński 11 February 2015 в 07:21
  • 2
    Адам, ваше решение вложенных скобок не работает, когда в нем есть строка с . ... – patrick 7 December 2015 в 03:54
([[][a-z \s]+[]])

Выше должно работать, учитывая следующее объяснение

  • символов в квадратных скобках [] определяет класс characte, который означает, что шаблон должен соответствовать как минимум одному символу, указанному в квадратных скобках
  • \ s указывает пространство
  • + означает, что по крайней мере один из символов, упомянутых ранее, на +.
2
ответ дан Peon 25 August 2018 в 00:37
поделиться
  • 1
    В чувствительных случаях A-Z следует добавить к шаблону: ([[][a-zA-Z \s]+[]]); Я думаю, что это хороший способ, в то время как \ в шаблонах регулярных выражений, которые определяют в строковых меток (& quot; и '), и смешивание новичков с помощью обратного слэша в & quot; или "обычаев! – MohaMad 1 March 2017 в 11:46

Могут ли скобки быть вложенными?

Если нет: \[([^]]+)\] соответствует одному элементу, включая квадратные скобки. Backreference \1 будет содержать элемент, который будет соответствовать. Если ваш regex-аромат поддерживает lookaround, используйте

(?<=\[)[^]]+(?=\])

Это будет соответствовать только элементам внутри скобок.

29
ответ дан Tim Pietzcker 25 August 2018 в 00:37
поделиться
  • 1
    Это означает только первое появление – Kunal Mukherjee 7 December 2017 в 14:28
  • 2
    @KunalMukherjee: Нет, регулярное выражение может соответствовать сколько угодно раз. Но для некоторых регулярных выражений нужно явно указывать повторное применение регулярного выражения (например, с помощью флага /g в JavaScript). – Tim Pietzcker 8 December 2017 в 16:30
Другие вопросы по тегам:

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