Regex, чтобы найти шаблон, не заключенный в кавычки [дубликат]

Если у вас была проблема, как у меня, что вы уже внесли некоторые изменения, но теперь по какой-либо причине вы хотите избавиться от нее, самый быстрый способ - использовать git reset следующим образом:

git reset --hard HEAD~2

У меня было 2 не необходимых фиксации, следовательно, число 2. Вы можете изменить его на свой собственный номер фиксации для сброса.

Так что отвечая на ваш вопрос - если вы на 5 коммитов впереди удаленный репозиторий HEAD, вы должны запустить эту команду:

git reset --hard HEAD~5

Обратите внимание, что вы потеряете сделанные вами изменения, поэтому будьте осторожны!

32
задан TheCloudlessSky 18 July 2012 в 14:20
поделиться

6 ответов

Это будет соответствовать любой строке вплоть до первого некоманда «,». Это то, что вы хотите?

/^([^"]|"[^"]*")*?(,)/

Если вы хотите всех (и в качестве контр-примера для парня, который сказал, что это невозможно), вы можете написать:

/(,)(?=(?:[^"]|"[^"]*")*$)/

, который будет соответствовать всем им. Таким образом,

'test, a "comma,", bob, ",sam,",here'.gsub(/(,)(?=(?:[^"]|"[^"]*")*$)/,';')

заменяет все запятые не внутри кавычек с точкой с запятой и выдает:

'test; a "comma,"; bob; ",sam,";here'

Если вам нужно, чтобы он работал через разрывы строк просто добавьте флаг m (многострочный).

76
ответ дан MarkusQ 17 August 2018 в 22:03
поделиться
  • 1
    Похоже, что он работает правильно - с двойными кавычками. (,) (? = (?: [^ "] | [" | '] [^ "] * *) * $) Я считаю, что работает с одинарной кавычкой или двойными кавычками. Благодаря! – SocialCensus 11 March 2009 в 15:39
  • 2
    Я хотел бы указать, что это не работает через разрывы строк. – SocialCensus 11 March 2009 в 15:43
  • 3
    @SocialCensus Затем используйте флаг m. Кроме того, ваш пример в комментарии выше имеет несколько ошибок. Например, для открытия котировок используются двойные кавычки, одинарные кавычки и вертикальные столбцы, но в качестве закрывающих котировок используются только двойные кавычки. – MarkusQ 11 March 2009 в 17:31
  • 4
    MarkusQ - Вы совершенно правы, и я сдаю свою лицензию на регулярное выражение. Твоя работа отлично. Моя, не так много. – SocialCensus 11 March 2009 в 20:26
  • 5
    это работает awesome UNTIL у вас есть одна цитата между запятыми :-( – Chris Hayes 14 January 2014 в 04:39

Следующие регулярные выражения будут соответствовать всем запятым, которые присутствуют вне двойных кавычек,

,(?=(?:[^"]*"[^"]*")*[^"]*$)

DEMO

ИЛИ (только для PCRE)

"[^"]*"(*SKIP)(*F)|,

"[^"]*" соответствует всем блокам с двойными кавычками. То есть в этом входе buz,"bar,foo" это регулярное выражение будет соответствовать только "bar,foo". Теперь следующий (*SKIP)(*F) делает совпадение неудачным. Затем он переходит к шаблону, который был рядом с символом | и пытается совместить символы с оставшейся строкой. То есть в нашем выходе , рядом с шаблоном | будет соответствовать только запятая, которая была сразу после buz. Обратите внимание, что это не будет соответствовать запятой, которая присутствовала внутри двойных кавычек, потому что мы уже пропустили пропущенную двойную кавычку.

DEMO


. Следующее регулярное выражение будет соответствовать всем запятым, которые присутствуют внутри двойных кавычек,

,(?!(?:[^"]*"[^"]*")*[^"]*$)

DEMO

7
ответ дан Avinash Raj 17 August 2018 в 22:03
поделиться

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

(?:"(?:[^\\"]+|\\(?:\\\\)*[\\"])*"|'(?:[^\\']+|\\(?:\\\\)*[\\'])*')\s*=>\s*(?:"(?:[^\\"]+|\\(?:\\\\)*[\\"])*"|'(?:[^\\']+|\\(?:\\\\)*[\\'])*')\s*,

Это также позволяет использовать строки типа "'foo\'bar' => 'bar\\',".

1
ответ дан Gumbo 17 August 2018 в 22:03
поделиться

@SocialCensus. Пример, который вы указали в комментарии к MarkusQ, где вы выбрали «рядом с», не работает с примером, который MarkusQ дал прямо над этим, если мы изменим sam на sam's : (test, «запятая», «bob», «sam's», здесь) не имеет сопоставления с (,) (? = (?: [^ "'] | [" |' ] [^ "'] ") $). На самом деле сама проблема: «Я действительно не забочусь о одиночных или двойных кавычках», неоднозначна. Вы должны четко понимать, что вы имеете в виду цитируя либо «или с». Например, разрешено вложенность или нет? Если да, то сколько уровней? Если только один вложенный уровень, что происходит с запятой вне внутренней вложенной цитаты, но внутри внешней котировки вложенности? Вы также должны учитывать, что одиночные кавычки происходят сами по себе как апострофы (т. Е., Как и контр-пример, который я дал ранее с помощью самса). Наконец, регулярное выражение, которое вы сделали, на самом деле не рассматривает одиночные кавычки на пар с двойными кавычками, так как предполагает, что последний тип кавычки обязательно является двойной цитатой - и замена этой последней двойной кавычки на ['| "] также имеет проблему если текст не содержит правильного цитирования (или если используются апострофы), я полагаю, что мы, вероятно, могли бы предположить, что все кавычки правильно определены.

Регулярное выражение MarkusQ отвечает на вопрос: найдите все запятые, которые имеют четное количество двойных кавычек после него (т. е. вне двойных кавычек) и игнорировать все запятые, которые после него имеют нечетное число двойных кавычек (т. е. находятся внутри двойных кавычек). Это, как правило, то же самое решение, что и вы, вероятно, хотите , но давайте посмотрим на несколько аномалий. Во-первых, если кто-то перестает отмечать кавычки в конце, то это регулярное выражение находит все неправильные запятые, а не находит нужные или не соответствует никаким. Конечно, если двойная кавычка отсутствует, все ставки отключены, так как может быть неясно, если t он пропустил один из них в конце или вместо этого принадлежит в начале; однако есть закон, который является законным, и где регулярное выражение может провалиться (это вторая «аномалия»). Если вы отредактируете регулярное выражение для перехода по текстовым строкам, вы должны знать, что цитирование нескольких последовательных абзацев требует, чтобы вы поместили одну двойную кавычку в начале каждого абзаца и не оставили цитату в конце каждого абзаца, за исключением конец последнего абзаца. Это означает, что в пространстве этих абзацев регулярное выражение не удастся в некоторых местах и ​​преуспеть в других.

Примеры и краткие обсуждения цитат с параграфами и вложенных цитат можно найти здесь http: / /en.wikipedia.org/wiki/Quotation_mark.

1
ответ дан Jose_X 17 August 2018 в 22:03
поделиться
  • 1
    Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – mattt 23 December 2014 в 22:27
  • 2
    Я должен еще раз взглянуть на эту проблему, но я заметил, что мой «ответ» был довольно длинным. Будет ли это соответствовать комментарию? Кроме того, мой старый ответ, похоже, отвечает, что нет однозначного правильного ответа из-за двусмысленности в вопросе (я приводил примеры). Я, вероятно, подумал, что этот ответ / критика выходит за рамки комментария к автору и добавляет контекст тем, кто ищет ответ. Я даже мог отредактировать вопрос или мне пришлось бы полагаться на кого-то другого? [Нужно смотреть дальше на эту проблему, которую вы поднимаете, когда я нахожу время] – Jose_X 5 March 2015 в 19:09
  • 3
    @mattt не означает, что вы игнорируете ваш запрос. Сейчас у меня короткое время. – Jose_X 5 March 2015 в 19:35
  • 4
    Этот комментарий был автоматически сгенерирован из флаговых средств модерации комментариев. На самом деле, мой единственный совет заключался в том, чтобы way менее подробный. Stack Overflow вознаграждает четкие, сжатые ответы, которые доходят до сути. – mattt 5 March 2015 в 23:22

Ответ MarkusQ отлично поработал для меня около года, пока он этого не сделал. Я просто получил ошибку переполнения стека на строке с примерно 120 запятыми и 3682 символами. В Java, например:

        String[] cells = line.split("[\t,](?=(?:[^\"]|\"[^\"]*\")*$)", -1);

Вот моя чрезвычайно неэлегантная замена, которая не переполняет переполнение:

private String[] extractCellsFromLine(String line) {
    List<String> cellList = new ArrayList<String>();
    while (true) {
        String[] firstCellAndRest;
        if (line.startsWith("\"")) {
            firstCellAndRest = line.split("([\t,])(?=(?:[^\"]|\"[^\"]*\")*$)", 2);
        }
        else {
            firstCellAndRest = line.split("[\t,]", 2);                
        }
        cellList.add(firstCellAndRest[0]);
        if (firstCellAndRest.length == 1) {
            break;
        }
        line = firstCellAndRest[1];
    }
    return cellList.toArray(new String[cellList.size()]);
}
1
ответ дан sullivan- 17 August 2018 в 22:03
поделиться

Хотя можно взломать его с помощью регулярного выражения (и мне нравится злоупотреблять регулярными выражениями так же, как и следующий парень), вы рано или поздно столкнетесь с проблемой обработки подстрок без более продвинутого синтаксического анализатора. Возможные способы попадания в проблему включают смешанные кавычки и экранированные кавычки.

Эта функция разделяет строку на запятую, но не те запятые, которые находятся внутри строки с одним или двумя кавычками. Его можно легко расширить с помощью дополнительных символов для использования в качестве кавычек (хотя для пар символов, таких как «», потребуется еще несколько строк кода), и даже скажет вам, если вы забыли закрыть цитату в своих данных:

function splitNotStrings(str){
  var parse=[], inString=false, escape=0, end=0

  for(var i=0, c; c=str[i]; i++){ // looping over the characters in str
    if(c==='\\'){ escape^=1; continue} // 1 when odd number of consecutive \
    if(c===','){
      if(!inString){
        parse.push(str.slice(end, i))
        end=i+1
      }
    }
    else if(splitNotStrings.quotes.indexOf(c)>-1 && !escape){
      if(c===inString) inString=false
      else if(!inString) inString=c
    }
    escape=0
  }
  // now we finished parsing, strings should be closed
  if(inString) throw SyntaxError('expected matching '+inString)
  if(end<i) parse.push(str.slice(end, i))
  return parse
}

splitNotStrings.quotes="'\"" // add other (symmetrical) quotes here
2
ответ дан Touffy 17 August 2018 в 22:03
поделиться
Другие вопросы по тегам:

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