Регулярное выражение для неполных строк в пределах известных начальной и конечной строк - PullRequest
2 голосов
/ 02 августа 2009

Я хочу вставить в базу данных следующее:

(# text1 #, # text2 #, # text3 #, # text4 #, # text5 #, # text6 #, # text7 #, # text8 #, # text9 #), (# text1 #, # text2 #, # text3 #, # text4 #, # text5 #, # text6 #, # text8 #, # text9 #), (# text1 #, # text2 #, # text3 #, # text4 #, # text5 #, # text6 #, # text7 #, # text8 #, # text9 #);

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

(# text1 #, # text2 #, # text3 #, # text4 #, # text5 #, # text6 #, # text7 #, # text8 #, # text9 #), (# text1 #, # text2 #, # text3 #, # text4 #, #), <<< --- Строка разрывает и портит мою вставку (# text1 #, # text2 #, # text3 #, # text4 #, # text5 #, # text6 #, # text7 #, # text8 #, # text9 #); </p>

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

Я пытался /^\(#.*?#,#.*?#,#.*?#,#.*?#,#.*?#,#.*?#,#.*?#,#.*?#,#.*?#\)$/ig, но это не сработало.

Я создал страницу, где вы можете вставить регулярное выражение, чтобы увидеть, работает ли ваше решение .

Ответы [ 4 ]

2 голосов
/ 02 августа 2009

Как насчет:

/^\((?:#.+#,\s*){8}(?:#.+#\s*)\)[,;]$/gm

Это 8 неперехватывающих групп текстового поля с одним или несколькими символами, за которыми следуют запятая и необязательный пробел, и еще одно текстовое поле без запятой, заключенное в буквальные скобки, за которым следует запятая или точка с запятой. Если в одной текстовой строке несколько строк, обязательно используйте переключатель «/ m», чтобы «^» и «$» соответствовали символам новой строки.

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

Обновление:

Понял. Вот тот, который соответствует строкам с 8 или менее парами символов "#" или с нечетным числом из них:

^\((?:[^#\n]*?#[^#\n]*?#[,\s]?){0,8}(?:[^#]*#[^#]*)?\)[,;]\s*$

, которая будет соответствовать строке вроде:

(#text1#,#text2#,#text3#,#text4#),

или строка типа:

(#text1#,#text2#,#text3#,#text4#,#),

edit: запятая должна быть необязательной ...

image

Похоже, что ваши новые примеры больше не являются строковыми, и у вас больше нет "одиночного #", поэтому его можно упростить до:

\((?:[^#\n]*?#[^#\n]*?#[,\s]?){0,8}\)[,;]\s*
1 голос
/ 02 августа 2009

Вы можете попробовать это с этим:

/^\(([\s]*#[^#]+#,?){9}\)[,;]$/

редактировать

В Perl, если вы хотите удалить вхождения любого шаблона из вышеприведенного набора, который имеет менее 9 #\d#, вы можете использовать следующее:

$string =~ s/\(([\s]*#[^#]+#[\s]*,?){0,8}\)[,;]*//g;

Он допускает пробелы в любом конце #\d#, необязательную запятую, разделяющую их в скобках, а также запятую или точку после группы. Полученный $string будет списком из 9 групп токенов из входной строки, как они отображаются в оригинале.

0 голосов
/ 02 августа 2009

Удаление из строки имеет некоторые сложности, например, что делать со строкой ошибки, если она последняя - содержит;

line = ^\s*\(.*\)[,;]\s*$
a string token = #[\w\s]*#
a list of tokens = token(?:\s*,\s*token)
7 or less items {0,7}
a list of 8 or less tokens = token(?:\s*,\s*token){0,7}

Изготовление

^\s*\(#[\w\s]*#(?:\s*,\s*#[\w\s]*#){0,7}\)\s*[,;]\s*$

, с помощью которого вы хотите заменить эти строки ни на что, трактуя строку как несколько строк / Матч / заменить / г

/^\s*\(#[\w\s]*#(?:\s*,\s*#[\w\s]*#){0,7}\)\s*[,;]\s*$//gm

Если для вставки вы задали символ строки #, то токен можно было бы упростить до # [^ #] + #

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

0 голосов
/ 02 августа 2009
/^\((#\w+#,?\s?){9}\)$/ matches exactly 9.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...