【问题标题】:Regular expression for end of line行尾的正则表达式
【发布时间】:2017-07-01 08:25:15
【问题描述】:

我正在尝试使用正则表达式解析GEDCOM 文件,并且快到了,但表达式会抓取文本的下一行,以获取行尾有可选文本的行。每条记录应该是一行。

这是文件的摘录:

0 HEAD
1 CHAR UTF-8
1 SOUR Ancestry.com Family Trees
2 VERS (2010.3)
2 NAME Ancestry.com Family Trees
2 CORP Ancestry.com
1 GEDC
2 VERS 5.5
2 FORM LINEAGE-LINKED
0 @P6@ INDI
1 BIRT

这是我正在使用的正则表达式:

(\d+)\s+(@\S+@)?\s*(\S+)\s+(.*)

这适用于所有行,除了那些末尾不包含任何文本的行,例如第一行。例如,第一条记录的最后一个捕获组包含“1 CHAR UTF-8”。

这是来自 regex101.com 的屏幕截图,显示了紫色捕获组如何渗入下一行:

我尝试使用 $ 限定符将 .* 限制为仅行尾,但这失败了,因为第二行也是行尾。

【问题讨论】:

  • \s 匹配换行符,尝试将其替换为常规空格,或 [^\S\r\n](如果是 PCRE,则为 \h)。请参阅regex101.com/r/N2ZWWo/1(^ 也与多行选项一起添加)。
  • 非常感谢 Wiktor,如果您想创建一个答案,我将标记为最佳。这似乎可以解决问题: (\d+) +(@\S+@)? (\S+) *(.)
  • .* 默认情况下是贪婪的,并且会尽可能匹配。尝试.*?$ 使其成为非贪婪匹配。

标签: regex multiline gedcom


【解决方案1】:

\s 模式匹配换行符。将其替换为常规空格,或[^\S\r\n],或\h(如果是PCRE)或[\p{Zs}\t]。

(\d+) +(@\S+@)? *(\S+) +(.*)

见regex demo

如果您需要匹配行,您可以添加多行选项并在两侧添加锚点(^ 在模式的开头和$ 在模式的末尾)(见@ 987654322@).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多