【问题标题】:maintain text but eliminate CR LF between tags保留文本但消除标签之间的 CR LF
【发布时间】:2011-08-28 03:36:59
【问题描述】:

各位正则表达式,

我有一个包含如下表达式的平面文件:

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)

原谅我的无赖。 最好的祝福, 山猫开普勒

【问题讨论】:

  • 你能展示一个输入和结果的例子吗?我没有得到第一个示例与另一个示例的关系,因为引号和换行符不同。
  • 我更正了输入和输出,现在只有引号和换行符不同(或应该)。本质上,我想交换空格字符引号之间的每个换行符。

标签: javascript regex vbscript flat-file ecma262


【解决方案1】:

如果下一个 " 位于行尾,您可以先删除所有 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

然后,在第二步中,删除引号:

result = subject.replace(/^"|"$/mg, "");

【讨论】:

  • 这个解决方案忽略了许多没有引号的单行 - 它们将被连接起来。
  • @Lynx Kepler:你说得对,我错过了那个案子。我认为我的新解决方案现在有效。
  • 您使用了哪种正则表达式?您在哪个程序中运行了这个正则表达式?
  • 我无法在 TextCrawler 中重现它。但我会试试这个 RegexBuddy。
  • 您是否记得在将斜杠复制到 RegexBuddy 之前删除它?
【解决方案2】:

使用 Perl,您可以执行以下操作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多