【问题标题】:Select the next line after match regex在匹配正则表达式后选择下一行
【发布时间】:2016-09-28 07:35:09
【问题描述】:

我目前正在使用扫描软件“Drivve Image”从每篇论文中提取某些信息。如果需要,该软件可以运行某些 Regex 代码。它似乎与 UltraEdit 正则表达式引擎一起运行。

我得到以下扫描结果:

 1. 21Sid1
 2. Ordernr
 3. E17222
 4. By
 5. Seller

我需要在字符串中搜索文本Ordernr,然后选择下面的行E17222,最后将是扫描文档的文件名。我永远不会知道这两个值在字符串中的确切位置。这就是为什么我需要关注Ordernr,因为我需要的文本将始终作为下一行。

我的要求是,我需要 E17222 成为匹配结果中唯一的东西才能使它起作用。我只能输入普通的正则表达式。

已经有一个很棒的帖子:Regex to get the words after matching string

我已经测试过“\bOrdernr\s+\K\S+”,效果很好..

如果不是该软件不允许使用 /K。还有其他实现\K的方法吗?

继续

尽管如果示例文本涉及“Ordernr”后面的字符,则当前答案无法达到我需要的程度。喜欢这个示例:

21Sid1

订单 1

E17222

卖家

当前解决方案选择“1”而不是“下一行”,即“E17222”。在匹配组中。需要指出这一点以进一步参与该问题。

【问题讨论】:

  • 我怀疑lookbehind会起作用,但请尝试(?<=\bOrdernr\r\n)\S+(如有必要,将换行符调整为\r\n)。
  • 您能否包含您正在使用的确切示例文本?
  • 看来 Drivve Image 支持 .NET 正则表达式风格(link to download the PDF Manual),所以我上面的正则表达式可以写成(?<=\bOrdernr[\r\n]+)\S+。不过,我觉得 ClasG 的建议是正确的。

标签: regex regex-negation regex-lookarounds


【解决方案1】:

说明

ordernr[\r\n]+([^\r\n]+)

此正则表达式将执行以下操作:

  • 找到ordernr 子字符串
  • ordernr捕获组1之后放置一行

示例

现场演示

https://regex101.com/r/dQ0gR6/1

示例文本

 1. 21Sid1
 2. Ordernr
 3. E17222
 4. By
 5. Seller

示例匹配

[0][0] = Ordernr
 3. E17222
[0][1] =  3. E17222

说明

NODE                     EXPLANATION
----------------------------------------------------------------------
  ordernr                  'ordernr'
----------------------------------------------------------------------
  [\r\n]+                  any character of: '\r' (carriage return),
                           '\n' (newline) (1 or more times (matching
                           the most amount possible))
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [^\r\n]+                 any character except: '\r' (carriage
                             return), '\n' (newline) (1 or more times
                             (matching the most amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------

或者

仅使用环视捕获线,以便 ordernr 不包含在捕获组 0 中,并适应 \r\n 的所有变化

(?<=ordernr\r|ordernr\n|ordernr\r\n)[^\r\n]+

现场演示

https://regex101.com/r/pA4fD4/2

【讨论】:

  • 我也可以确认这个答案也有效。尽管我对正则表达式的了解有限,因此我不确定哪个答案更好......“如果有这样的事情”。 @Ro Yo Mi
  • 这与接受的答案之间的细微差别在于,这将匹配限制为仅允许行尾字符,而接受的答案允许匹配所有空白字符并假设空格和换行符字符是可互换的,这可能会导致一些奇怪的边缘情况。
  • 从这个例子中,是否可以根据匹配的子字符串后的新行进行拆分?我有一个脚本需要按新行拆分,但是由于系统限制,如果文件太长,它将无法工作。所以我想通过匹配为子字符串然后找到该行的结尾来将其分块。我正在使用 '\r\n|\r|\n' 作为我的新行正则表达式。 @RoYoMi
  • 哇,很好的解释。谢谢。
  • 这是一个绝妙的答案!干得好!
【解决方案2】:

做了一些谷歌搜索,据我所知,REGEXP.MATCH 的最后一个参数是要使用的捕获组。这意味着您可以使用自己的正则表达式,而无需 \K,只需将捕获组添加到您要提取的号码。

 \bOrdernr\s+(\S+)

这意味着该数字最终在捕获组 1 中(整个匹配在 0 中,我假设你已经使用过)。

文档不是很清楚,但我猜语法是

REGEXP.MATCH(<ZoneName>, "REGEX", CaptureGroup)

意味着你应该使用

REGEXP.MATCH(<ZoneName>, "\bOrdernr\s+(\S+)", 1)

这里有很多猜测...... ;)

【讨论】:

  • 我可以确认此答案适用于我的软件。 @ClasG
  • @R0jiv4 太好了。请考虑将其标记为已接受,以便有类似问题的人更容易找到它。
  • 以为我在帖子中添加了一个“延续”,其中涉及 Ordernr 后面的字符。
猜你喜欢
  • 2022-11-02
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多