我正在尝试在字符串中搜索字符,但只能在搜索字符串本身的范围内搜索。
例如,假设我必须在其中寻找字符“ o”;
the quick fox jumped over the lazy dog
但是,我只需要搜索范围为字符20(字母d)和字符25(字母r)的字符。
我该如何写一个正则表达式来匹配两个位置之间的这个字符?
我尝试^(.{20})o(.{13})$
无济于事。我所能找到的只是有关字符范围的资源(例如[A-Z])而不是位置范围
答案 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之间的字符时会停止
答案 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
量词的失败。
我的猜测是可能需要某种递归,但是很难整合。
答案 3 :(得分:0)
如果要捕获单个o,则可以使用捕获组:
^.{20}[^o]*(o)
^
字符串的开头.{20}
匹配任意字符20次[^o]*
匹配0次以上而不是o
(o)
在与o
相匹配的组1中捕获如果要多次捕获o
和finite/infinite lookbehind,则可以使用:
(?<=^.{20,24})o
(?<=
向后看,断言左边是
^
断言字符串的开头.{20,24}
匹配除换行符以外的任意字符20至24次)
积极回望o
匹配'
答案 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