сохранить текст, но исключить CR LF между тегами - PullRequest
0 голосов
/ 18 мая 2011

Товарищ Regexers,

У меня есть плоский файл, полный выражений вроде:

SELECT * FROM CONVENIENT_ONE_LINE_QUERY
"SELECT * FROM THIS_QUERY
WHERE IS_SPREAD_OVER == 123
ORDER BY MULTIPLE_LINES
HAVING AND_IS_BETWEEN_QUOTES"
SELECT * FROM ANOTHER_CONVENIENT_ONE_LINER

Я хочу исключить CRLF между цитатами и самими цитатамитак, чтобы все мои запросы были удобными однострочными, как это:

SELECT * FROM CONVENIENT_ONE_LINE_QUERY
SELECT * FROM THIS_QUERY WHERE IS_SPREAD_OVER == 123 ORDER BY MULTIPLE_LINES HAVING BUT_IS_BETWEEN_QUOTES
SELECT * FROM ANOTHER_CONVENIENT_ONE_LINER

Пожалуйста, опубликуйте версию RegEx, использованную в решении.Я использую TextCrawler, который утверждает, что он ECMA262 (такой же, как VBScript / Javascript), и ближе всего я пришел к решению, что-то вроде:

(\r\n".*)(.*)\r\n(.*"\r\n)

Прости мое беспокойство.С наилучшими пожеланиями, Рысь Кеплер

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Вы можете сначала удалить все CRLF, если следующий " находится в конце строки:

result = subject.replace(/\r\n(?=[^"]*"$)/mg, " ");

Пояснение:

\r\n    # Match a CRLF
(?=     # if and only if
 [^"]*  # it is followed by any number of non-quote characters
 "      # and a quote
 $      # at the end of a line
)       # End of lookahead.

Это преобразует ваш пример в

SELECT * FROM CONVENIENT_ONE_LINE_QUERY
"SELECT * FROM THIS_QUERY WHERE IS_SPREAD_OVER == 123 ORDER BY MULTIPLE_LINES HAVING AND_IS_BETWEEN_QUOTES"
SELECT * FROM ANOTHER_CONVENIENT_ONE_LINER

enter image description here

Затем, на втором шаге, удалите кавычки:

result = subject.replace(/^"|"$/mg, "");
0 голосов
/ 18 мая 2011

С Perl вы можете сделать что-то вроде:

s/^"([^"]*)"$/$s = $1; $s =~ s!(?:\n|\r)+! !g; $s/meg

...