正则表达式-检查“行范围”内的字符

时间:2019-07-02 22:49:27

标签: regex

我正在尝试在字符串中搜索字符,但只能在搜索字符串本身的范围内搜索。

例如,假设我必须在其中寻找字符“ o”;

the quick fox jumped over the lazy dog

但是,我只需要搜索范围为字符20(字母d)和字符25(字母r)的字符。

我该如何写一个正则表达式来匹配两个位置之间的这个字符?

我尝试^(.{20})o(.{13})$无济于事。我所能找到的只是有关字符范围的资源(例如[A-Z])而不是位置范围

5 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式:

/^.{0,20}.*(o).*r/

在此正则表达式中,将锚点放在^的开头,以确保匹配从字符串的第一个字符开始,然后我们从0到20,正好是字母d的末尾跳,然后使用.*,因为直到到达o,我们才知道要到达char .*和另一个r的空间,

演示https://regex101.com/r/PLHS43/1

使用此正则表达式还有另一种方法:

/^.{0,20}.*(o).*?r{1}/

基本上是一样的,但是在找到第一个r并匹配o字符20和25之间的字符时会停止

演示:https://regex101.com/r/3cX2gw/1

答案 1 :(得分:0)

您是否必须搜索单个正则表达式? Unix以使用管道连接命令而不用编写复杂且不确定的表达式而感到自豪。

在外壳中

 echo 'the quick fox jumped over the lazy dog' | cut -c 20-25

或使用Javascript:

 'the quick fox jumped over the lazy dog'.substr(19,6)

两者都将给出一个“ d over”切片,然后给出一个简单的表达式来查找字母“ o”,并在下一步中截取您想要的内容。

答案 2 :(得分:0)

为给定问题设计表达式是一个难题,也许我们可以从以下内容开始:

^.{0,21}\K((?:[^o]*)(o*)|(o*)(?:[^o]*)).{4}.*\K$

但是,当找到任何4时,我们将遇到挑战,包括o量词的失败。

我的猜测是可能需要某种递归,但是很难整合。

Demo

答案 3 :(得分:0)

如果要捕获单个o,则可以使用捕获组:

^.{20}[^o]*(o)
  • ^字符串的开头
  • .{20}匹配任意字符20次
  • [^o]*匹配0次以上而不是o
  • (o)在与o相匹配的组1中捕获

Regex demo

如果要多次捕获ofinite/infinite lookbehind,则可以使用:

(?<=^.{20,24})o
  • (?<=向后看,断言左边是
    • ^断言字符串的开头
    • .{20,24}匹配除换行符以外的任意字符20至24次
  • )积极回望
  • o匹配'

例如regex demo in C#

答案 4 :(得分:0)

这会在字符串的第20个字符与第25个字符之间找到字母“ o”:

^.{20}[^o]{0,4}\Ko

**说明:

^               # beginning of line
  .{20}         # 20 any characters
  [^o]{0,4}     # 0 up to 4 any character that is not o
  \K            # forget all we have seen until this psition
  o             # the letter o

Demo