正则表达式获取列

Regex get column

给定以下 ; 分隔字符串:


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

a;b;bb;;;34

我希望获得第一列不是 db ytoy.

的任何行的第 3 列(如果存在)

所以期望的结果是


 z

io

bb

到目前为止我有这个正则表达式:

^(?!(d|b y|toy);([^;\r\n]*);([^;\r\n]*)).*\R

如图所示demo

据我所知,至少有两个问题:

第一列中包含d的第5行是匹配的,不应该

比赛没有返回分组

任何帮助将不胜感激

您可以使用此正则表达式来匹配第三列中的所需值:

^(?!d|b y|toy)(?:[^;\n]*;){2}([^;\n]+)

它断言字符串不以 db ytoy 开头,然后跳过两列值并捕获组 1 中的第三列。通过添加 .* 到该正则表达式的末尾,然后 ^.*$ 到正则表达式,我们可以丢弃任何与第一个正则表达式不匹配的内容,只需替换为 </code>:</p> <pre><code>^(?!d|b y|toy)(?:[^;\n]*;){2}([^;\n]+).*$|^.*$

Demo on regex101

我想你可以使用

^(?:([^\r\n;]*)(?:;(?!(?:23|b)(?=;|$))([^\r\n;]*)(?:;([^\r\n;]*))?.*)?|.*)$

regex demo

  • ^ - 字符串开头
  • (?:([^\r\n;]*)(?:;(?!(?:23|b)(?=;|$))([^\r\n;]*)(?:;([^\r\n;]*))?.*)?|.*) - 非捕获组:
    • ([^\r\n;]*)(?:;(?!(?:23|b)(?=;|$))([^\r\n;]+)(?:;([^\r\n;]*))?.*)? -
      • ([^\r\n;]*) - 第 1 组:除 LF、CR 和 ;
      • 之外的 0+ 个字符
      • (?:;(?!(?:23|b)(?=;|$))([^\r\n;]+)(?:;([^\r\n;]*))?.*)? - 一个可选的非捕获组:
      • ; - 一个分号
      • (?!(?:23|b)(?=;|$))([^\r\n;]*) - 除 CR、LF 和 ; 之外的 0 个或更多字符 但不等于 23b
      • (?:;([^\r\n;]*))? - 一个可选的非捕获组匹配 ; 然后捕获到组 X 0+ 个字符,而不是 LF、CR 和 ;
      • .* - 除换行字符外的任何 0+ 个字符,尽可能多
    • | - 或
    • .* - 除换行字符外的任何 0+ 个字符,尽可能多
  • $ - 字符串结尾。