regex 一般表示式:lookaheadAssert不像lookbehindAssert预期的那样工作

k10s72fa  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(130)

我试图创建一个正则表达式,它可以识别文本中包含特定单词的句子-在本例中为“JavaScript”。我的方法是提取句子前面的部分,然后将句子从文本的其余部分中分离出来。
为了得到前面的部分,我使用了这个正则表达式:

.*\.\s(?=.*?JavaScript)

这和预期的一样。lookaheadAssert查找不包括包含“JavaScript”的句子的最长前面部分。我在Assert中使用了非贪婪模式,在匹配中使用了贪婪模式,这似乎适合于查找最长的部分。
为了从文本的其余部分获取句子,我使用了这个正则表达式:

(?<=(.*\.\s(?=.*?JavaScript))).*?\.\s

然而,我发现由lookbehindAssert标识的前面部分与第一步的结果不同,尽管两者使用完全相同的正则表达式。看起来好像同时选择了前面部分的不同长度。
我想知道我的方法出了什么问题。
这是我在屏幕截图中使用的文本。第三句话是应该摘录的。

Edit the Expression & Text to see the matches.
Roll over matches or the expression for details.
PCRE & JavaScript flavors of RegEx are supported.
Validate your expression with Tests mode.
9wbgstp7

9wbgstp71#

不清楚你的输入是一行还是多行,所以这里有一个解决方案来提取任何包含“JavaScript”的句子:

/[^.]*\bJavaScript\b[^.]*\./g

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

/                 Start delimiter
  [^.]*           Optionally find anything not a period
  \bJavaScript\b  Word-boundaried "JavaScript"
  [^.]*\.         Optionally find anything not a period leading up to a period
/g                Close delimiter with global flag

相关问题