【问题标题】:regex: If "/" is found in line, Ingore string up until "/" and match everything after正则表达式:如果在行中找到“/”,则 Ingore 字符串直到“/”并匹配之后的所有内容
【发布时间】:2022-01-20 09:45:11
【问题描述】:

我是新手,如有任何不准确之处,敬请原谅。

我正在尝试编写一个正则表达式,在特定位置的一行中查找“/”。如果找到,它应该忽略之前的所有内容并匹配之后的所有内容。

到目前为止,我想出了

^(?(?=^.{6}[\/])[a-zA-Z0-9\_\-]+|\n)

但似乎恰恰相反;如果在 7. 位置找到“/”,则匹配“/”之前的所有内容。我受到不同线程的启发,但我仍然无法使其工作。

对我做错了什么有什么想法吗?

【问题讨论】:

  • 如果没有/,是否需要匹配整个字符串?也许^(?:.{6}\/\K)?.*?见demo
  • 如果没有/,则应该忽略该行。我不知道 \K 的存在,它似乎在做伎俩。

标签: regex regex-lookarounds


【解决方案1】:

^(?(?=^.{6}[\/])[a-zA-Z0-9\_\-]+|\n) 模式使用 if 子句,其中 if 部分有一个 6 个字符的断言,后跟 /

断言在字符串的开头,不消耗字符。如果该断言为真,则匹配 [a-zA-Z0-9\_\-]+ 或换行符,因此消耗部分从那里开始,这就是您得到匹配的原因。

它匹配前 6 个字符,而不是 /,因为它不在字符类中。


您可以使用捕获组匹配第 7 位 / 之后的所有允许字符。

^.{6}\/([a-zA-Z0-9_-]*)
  • ^ 字符串开始
  • .{6}\/ 匹配 6 个字符和 /
  • ([a-zA-Z0-9_-]*) 捕获组 1,可选择匹配字符类中列出的任何一个

Regex demo

或者if supported你可以使用\K忘记到目前为止匹配的内容:

^.{6}\/\K[a-zA-Z0-9_-]*
  • ^ 字符串开始
  • .{6}\/ 匹配 6 个字符和 /
  • \K清除匹配缓冲区(忘记匹配到现在)
  • [a-zA-Z0-9_-]* 可选匹配字符类中列出的任何一个

Regex demo

【讨论】:

  • 第二种解决方案看起来很有趣,但是“如果支持”是什么意思?何时何地不支持?
  • @RezaSaadati 看到这个页面regular-expressions.info/keep.html
猜你喜欢
  • 2011-09-15
  • 2020-03-16
  • 2017-09-02
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2014-01-10
相关资源
最近更新 更多