【问题标题】:Using regular expression to match words in the same column使用正则表达式匹配同一列中的单词
【发布时间】:2025-11-21 21:25:01
【问题描述】:

我想知道这是否可以在 C# 中使用正则表达式:

我想匹配多行文本中的单词“FOO”和“BAR”,但前提是这两个单词在连续行的同一列中开始。

换句话说,这应该匹配,因为两个单词都从同一列开始:

dha skj dh FOO dd fsdf sdf \n
xdsjk fh f BAR 98kf hkjdsf \n

这也应该匹配,即使在错误的地方还有一个“BAR”:

dha sk jdh FOO dd fsd fs df \n
xd BAR fhf BAR 98 kfhk jdsf \n

这应该匹配,因为单词从不同的列开始:

dhas kjdh FOO dd fsdfsd ddef \n
xdB2e ARfhf BAR 98kfh kj dsf \n

编辑

我设法使用这样的反向引用在两个单词的前缀相同的情况下获得匹配:

var pattern = @"(?m)^(.*?)(FOO).*$\n^\1(BAR)" ;
var result = Regex.Match( "xxxFOOyyyy\nxxxBARzzz", pattern ) ;

但我真正想要的是反向引用第一个捕获组的 length

【问题讨论】:

  • 谢谢。我添加了一个示例模式,它在一小部分情况下给出了正确的结果
  • 好的,好的,我明白了,但是现在还有一个问题:这里的最终结果是什么?对于任何给定的输入,您只需要 True/False 结果吗?它必须是单个正则表达式还是基于代码的解决方案也是“可接受的”?
  • 我需要从 Regex.Match() 返回的匹配项(因为“FOO”和“BAR”在这里只是占位符),我更喜欢单个正则表达式。

标签: c# .net regex


【解决方案1】:

你可以使用

(?m)^(?<o>.)*?(FOO).*\n(?<-o>.)*?(BAR)(?(o)(?!))

regex demo

详情

  • (?m) - 使^ 匹配 开头的RegexOptions.Multiline 修饰符的内联版本
  • ^ - 行首
  • (?&lt;o&gt;.)*? - 除换行符 (LF) 以外的任何字符,每次查找时都会被推入组 o 堆栈(递增)
  • (FOO) - 匹配 FOO 的组 1
  • .* - 该行的其余部分
  • \n - 换行符
  • (?&lt;-o&gt;.)*? - 除换行符 (LF) 之外的任何字符,每次查找时从组 o 堆栈(递减)中推出
  • (BAR) - 第 2 组:捕获 BAR 子字符串
  • (?(o)(?!)) - 如果 Group o 不为空(即,如果 FOO 之前第一行上的字符数与 @987654343 之前第二行上的字符数不同,则匹配失败的条件构造@)。

【讨论】:

最近更新 更多