【问题标题】:Regex get column正则表达式获取列
【发布时间】:2020-05-03 08:51:33
【问题描述】:

给定以下; 分隔字符串:


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

a;b;bb;;;34

我希望获得第一列不是db ytoy 的任何行的第三列(如果存在)。

所以想要的结果是


 z

io

bb

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

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

如图所示demo

在我看来至少有两个问题:

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

匹配没有返回分组

任何帮助将不胜感激

【问题讨论】:

  • 你想要^(?:(?!(?:d|b y|toy);)([^\r\n;]*)(?:;([^\r\n;]*))?(?:;([^\r\n;]*))?.*|.*)吗?见demo
  • 谢谢@WiktorStribiżew 请看一下这个demo 我在字符串toy 中添加了第四行并用$1 替换。现在正在返回此 toy 行,因为它不包括您编写的正则表达式中的 ; 。我试图将; 放在负前瞻之外,但没有成功。任何建议。
  • 如果您不需要检查 Col1 的确切值,您可以删除 ;。见regex101.com/r/3E5eQl/2
  • 如果这回答了您的问题,请告诉我,以便我发布并解释解决方案。否则,如果您需要更多帮助,请告知。
  • 谢谢@WiktorStribiżew 我需要更多帮助,如果有一个解释会很好。我现在更改了正则表达式来测试 Col2 here。按照您的模型,我试图将; 包含在该组中,正如您在第三组(?:;([^\r\n;]*))? 中所写的那样。所以我认为第 2 组应该是 (?:;(?!(?:23|b))([^\r\n;]*)) 之类的东西,但这不会捕获测试字符串 toy 中第 4 行中的第一组。这里有任何建议。

标签: regex pcre regex-lookarounds


【解决方案1】:

我觉得你可以用

^(?:([^\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;]*))? - 一个可选的非捕获组,匹配 ;,然后捕获到除 LF、CR 和 ; 之外的 X 组 0+ 字符
      • .* - 除换行符以外的任何 0+ 个字符,尽可能多
    • | - 或
    • .* - 除换行符以外的任何 0+ 个字符,尽可能多
  • $ - 字符串结束。

【讨论】:

  • 谢谢@WiktorStribiżew 我不会想出从测试列开始的可选非捕获组,向前。感谢您的输入和改进。最后一件事。 (?!23|b)([^\r\n;]*) 表示...但不是以 23b 开头。要求是它不是23b,整个值。请看这个demo,第7行d;23td不应该匹配。关于这个的任何建议
【解决方案2】:

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

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

它断言该字符串不以db ytoy 开头,然后跳过两列值并捕获第1 组中的第三列。通过将.* 添加到该正则表达式的末尾,然后将^.*$ 替换为正则表达式,我们可以丢弃与第一个正则表达式不匹配的任何内容,只需替换为$1

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

Demo on regex101

【讨论】:

  • 谢谢@Nick 我提到了第三个。列,例如,但它可以是任何列,包括第一列和/或组合,如 $3;$1 ,不超过第三列,即使它们存在。我会继续根据你的工作,看看我能不能解决这个问题
  • @fionpo 我只能回答您提出的问题...这将为您提供您所希望的问题结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多