【问题标题】:Multiline Regex does not work with tabs多行正则表达式不适用于选项卡
【发布时间】:2014-09-17 18:46:39
【问题描述】:

我有一个大文本文件,其中包含 TextWrangler 中的一些注释,我想使用 Regex 对其进行解析并将匹配项写入 CSV 文件以进行 MySQL 导入。这是一个示例来源:

ARCHIVE

02.09.2014 22:35 

title1
content
content
content
content

30.08.2014 18:13 

title2
content
    content with tab
    content with tab
content

...
more notes as above
...

每条笔记都以日期开头,后面是返回值,然后是标题和一些内容行。我目前正在 TW 查找对话框中使用以下正则表达式进行测试,并检查了 Grep 以获取每个注释的日期、标题和内容块:

\r(\d\d\.\d\d\.\d\d\d\d \d\d:\d\d)\s*\r\r(.+)(?s)((?:(?!\r\d\d\.\d\d\.\d\d\d\d \d\d:\d\d\s*\r).)*)

它的作用是查找由返回值包围的日期,然后捕获标题行,最后捕获后面的所有行,前提是没有遇到另一个日期块。后者使用非捕获负前瞻。在最后一步之前,使用 (?s) 启用 DOTALL 设置,包括点元字符中的返回。

在 Find 上面的示例源代码中,第一个注释有效,但第二个注释无效,其中一些行用制表符缩进。 TW 显示此错误:

这就是我卡住的地方。谁能给个提示?

【问题讨论】:

  • 您是否尝试将表达式中的空格替换为\s
  • \s 替换两个空格会使两个注释都失败。
  • 有一些关于 BBEdit 在复杂的正则表达式模式上崩溃的问题(请参阅stackoverflow.com/questions/9952957/…)。也许你可以想办法让它变得更简单?

标签: regex pcre textwrangler


【解决方案1】:

我对该模式进行了更多测试,发现 Regex/Grep 失败确实无法预测。

似乎与源中的选项卡有关,但可能有其他文本触发了该错误。例如,我发现在添加 Web url 时,包含选项卡的工作“注释”部分开始失败。

我在从 Snow Leopard 更新的 Mavericks 10.9.4 上使用 TextWrangler 3.5.3。在 Apple Mail 和其他应用程序中,我在这个系统上也遇到了许多不为人知的问题,所以我认为 TW 错误可能与 Mavericks 问题有关。我使用旧版 TW 的原因是我不喜欢左侧的侧边栏。

正如我在评论中所说,有一些关于 BBedit/TW 的 Grep 问题的问题,这些问题似乎不是来自 PCRE 正则表达式引擎,而是来自 BBedit 代码。当然 SO 帮不上忙。

【讨论】:

    【解决方案2】:

    不允许评论,我必须'回答'......

    • 您的正则表达式在 TW 4.5.9(在 10.9.5 上)运行良好。
    • 在 TW 4.5.9(在 10.9.5 上)中,它与“非捕获”位丢弃的情况一样好。 (至少对于比赛来说,就是这样。没有验证它的捕获。)
    • 在 TW 4.5.9 中,Web url 似乎也不会导致问题。

    可能

    \r(\d{2}\.\d{2}\.\d{4} \d{2}:\d{2})\s*\r\r(.+\r)((.+\r)+)(?!\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}\s*\r)
    

    确实符合您的目的(在 10.9.4 上的 TW 3.5.3 中也是如此。除了 TW 4.5.9 中的前导/尾随换行符(当然,如果实际需要,可以添加),它的捕获似乎是和你的一样)。

    【讨论】:

    • @Timm 建议的正则表达式是否进行了任何更改?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2013-05-01
    • 2021-11-05
    • 2020-07-07
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多