正则表达式 return 替换后仅非空

Regex return only non empty after substitution

给定 ; 分隔列的文本字符串:

a;; z
z;d;hh 
d;23
;;io;
b;b;12

a;b;bb;;;34

这个正则表达式

^(?:(a|b|z)(?:;|$)([^;\r\n]*)(?:;|$)([^;\r\n]*)(?:;.*)?|.*)$

通过此替换 </code> 将 return 第 3 列(如果存在)来自第一列为 <code>abz 的行,如图所示demo

我的问题是,如何 return 只有非空行,如:

    z
hh 
12
bb

感谢您的帮助

您仍然可以使用普通的正则表达式来做到这一点:您只需要在正则表达式模式中重新安排您的两个备选方案,并在末尾添加一个可选的换行符模式。

你的模式有 ^((O)(N)(E)|.*)$ 结构,所以如果第一个不匹配,第二个选择匹配整行,但是两个选择都将停止在行尾(你正在使用多行标志,所以$ 匹配换行符字符或字符串结尾之前的所有位置)。因此,您需要将其转换为 ^(?:(O)(N)(E)$|.*$\R?):

^(?:(a|b|z)(?:;|$)([^;\r\n]*)(?:;|$)([^;\r\n]*)(?:;.*)?$|.*$\R?)
                                                       ^^^^^^^^^

参见 regex demo,在 regex101 测试器中,注意使用 gm 修饰符。

所以,一般来说,模式是

  • ^ - 行首
  • (?: - 非捕获组的开始(因此 ^ 可以应用于两种选择):
    • (a|b|z)(?:;|$)([^;\r\n]*)(?:;|$)([^;\r\n]*)(?:;.*)?$ - 您的特定模式捕获必要的子字符串,直到 line/string
    • 结束
    • | - 或
    • .*$ - 除换行字符外的任何 0+ 个字符,尽可能多,直到 line/string结束($),然后
    • \R? - 一个可选的换行序列
  • ) - 小组结束。