2016-08-12 2 views
-1

Я пытаюсь извлечь часть струнных нижеРаспаковка части строки с использованием регулярных выражений

Я пытался (. *) (?: таблица) ?, он терпит неудачу в последнем случае. Как сделать захват выражения всей строку в отсутствии текста «таблица»

  1. Текст: «diningtable» Ожидаемый матч: столовая
  2. текста: «cookingtable» Match: приготовление пищи
  3. текста: «варочной «матч: приготовление пищи
  4. текст:„таблица“матч»:»
+0

Try [ '^ ((?:?! (Таблица)) +.)? (?: Таблица) $'] (https://regex101.com/r/bM8nZ8/1) –

+0

Ничего себе ... не могли бы вы объяснить это? – learningtocode

ответ

1

Если вы хотите использовать регулярное выражение, вы можете использовать этот один:

(^.*)(?=table)|(?!.*table.*)(^.+) 

Смотрите демо здесь: regex101

Идея такова: спичка все от начала строки ^ до слова table или если вы не найдете таблицу в строке, сопоставьте хотя бы один символ. (чтобы избежать совпадения пустых строк). Таким образом, когда он находит таблицу слов, он возвращает пустую строку (потому что она совпадает с началом строки до таблицы слов).

2

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

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

String output = input.replace("table", ""); 
+0

Хорошая точка! Я возьму это предложение :) Но я пытался изучить регулярное выражение, и это выглядело как довольно простая проблема, но, видимо, нет. – learningtocode

1

(.*)(?:table)? терпит неудачу с table (соответствует его) в качестве первой группы (.*) является жадного точка соответствует шаблону, который захватывает всю строку в группу 1. Регулярное выражение двигателя backtracks и ищет table в необязательной группе без захвата и соответствует пустой строке в конце строки.

enter image description here

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

^((?:(?!table).)+)(?:table)?$ 

См the regex demo

Теперь, группа 1 - ((?:(?!table).)+) - содержит tempered greedy token(?:(?!table).)+, который соответствует 1 или более символам, отличным от новой строки, которые не запускают последовательность table. Таким образом, первая группа никогда не будет соответствовать table.

Анкеры позволяют регулярному выражению соответствовать всей строке.

ПРИМЕЧАНИЕ: Решения без регулярных выражений могут оказаться более эффективными, хотя умеренный токен является довольно ресурсоемким.

Примечание 2: разворачивая закаленную жадную фишку обычно повышает производительность п раз:

^([^t]*(?:t(?!able)[^t]*)*)(?:table)?$ 

См another demo

Но обычно это выглядит "загадочное", "нечитаемый" и "неосновательный".

+0

Итак, используйте это решение **, если ** вы не можете использовать «нормальный» язык программирования. Развернутая версия работает намного быстрее, но ее очень сложно поддерживать, так как мало кто может понять хороший, эффективный шаблон регулярного выражения. –

+0

Есть ли способ извлечь все, кроме последней «таблицы», например «tablettable», чтобы вернуть планшет? – learningtocode

+2

Ну, это, конечно, возможно с * matching * - ['^ ((?: (?! Table $).) +) (?: Table)? $'] (Https://regex101.com/r/ oY0nI0/1). Но лучше всего проверить, заканчивается ли строка с 'table', и удалять ее. Или с regex.replace - 'table $'. –

1

Несмотря на других больших ответы, вы можете также использовать чередование:

^(?|(.*)table$|(.*))$ 

Это делает использование сброса ветви, так что ваше желаемое содержание всегда хранится в группе 1. Если ваш язык/инструмент выбора Безразлично» t поддержите его, вам нужно будет проверить, какая из групп 1 и 2 содержит строку.

Demo См

Смежные вопросы