【问题标题】:Can i match the character directly below another character in a string of arbitrary length?我可以匹配任意长度字符串中另一个字符正下方的字符吗?
【发布时间】:2019-08-16 03:50:49
【问题描述】:

给定一个任意长度的字符串、一个换行符和另一个相同长度的字符串,是否可以生成匹配第一行字符正下方的字符的正则表达式?

例如,对于所有这些输入,哪种单一正则表达式模式可以捕获 X 下方的字符:

........X..  and  .X.........  and  .....X..... etc.
...........       ...........       ...........

在我看来,你必须知道 X 的位置才能匹配下面的字符。手动我可以找出模式

X\.+\n.{8}(.)

在本例中捕获 X 下面的字符

........X..
...........

因为我知道 X 是第一行的第 9 个字符。但是,如果 X 有任何其他位置,这将不起作用,这是问题的核心。

所以问题是:是否可以在正则表达式中创建一个模式,匹配另一个字符下面的字符,那会是什么样子?

【问题讨论】:

  • 意识到认为正则表达式可以动态计算是一种谬误。没有什么比事实更远了。
  • IMO,这对于正则表达式来说似乎太具体了,利用字符串的索引可以更容易地完成。例如,在c#中,您可以找到'X'的index,然后转到下一行,然后拉出strLine[index]的字符
  • 但是可以肯定的是,可以预先构造一个正则表达式 (?m)^.{15}.+\r?\n^.{15}(.) 其中 group1 包含所述字符。

标签: regex


【解决方案1】:

假设您提前知道第一行的长度,这样的事情应该适用于任何位置的X

/.*?X.{11}(.)/gs

11 替换为您想要的行长。

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

【讨论】:

  • 这真是一个优雅的解决方案——完全忘记了单行模式!但是,当行长未知时,它不起作用,但也许像@dvo 建议的那样,使用正则表达式以外的东西可以更好地解决问题。感谢您的回答:)
【解决方案2】:

如果您正在处理您的确切示例,那么您基本上必须构建所有组合,因为正则表达式不会跟踪匹配的位置。如果您使用的是特定的编程语言,那么该语言可能会提供解决方案,但纯正则表达式不会。

((?:X\.{10}\n)(\.))|((?:\.X\.{9}\n)(:?\.)(\.))|((?:\.{2}X\.{8}\n)(:?\.{2})(\.))

我的例子只上升到第三位,但你明白了......

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

【讨论】:

  • 在处理他们的确切示例时,第一行的 X 与第二行的预期匹配之间的距离始终相同。考虑到这一点极大地简化了正则表达式:regex101.com/r/HOA9p1/2
  • @JoshuaWade 哇。你应该把它变成一个答案。
  • @JoshuaWade - 那样不行regex101.com/r/HOA9p1/3,唯一知道的是X在不同行的第一行的位置。
  • 我想你不能根据措辞做出我所做的假设。我将继续他们的示例,其中所有线长都是相同的。我认为这只有在他们需要一次性处理多个示例时才有意义,但我可能会遗漏一些东西。
猜你喜欢
  • 2021-09-28
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多