regex 所有的字符串匹配任务都可以只使用最基本的正则表达式语法来完成吗?

q7solyqu  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(95)

这里的“基本”是指不使用这些正则表达式语法/特性:

    • 非捕获组***(?:pattern)**
  • look ahead positive assert**(?=pattern)**
    • 否定Assert***(?!模式)**
    • 看后面***(?〈=模式)**
  • ...等等

如果我使用“捕获组”沿着那些元字符(例如\s\d),我可以完成所有工作吗?

gywdnpxw

gywdnpxw1#

假设我们想匹配一个以'dog'开始,以'cat'结束的字符串,但不包含'pig'。我们可以使用一个正则表达式来实现这一点,该表达式采用了回火贪婪令牌技术,该技术采用了负向前看:

dog(?:(?!pig).)*cat

Demo .
虽然逻辑上不可能证明这个任务不能用不包含lookaround的正则表达式来完成,但我不知道这样的表达式。请读者提出一个这样的表达式。
这个正则表达式可以分解如下。

dog      # match 'dog'
(?:      # begin a non-capture group
  (?!    # begin a negative lookahead
    pig  # match 'pig'
  )      # end the negative lookahead
  .      # match any character other than a line terminator
)        # end the non-capture group
*        # execute the preceding non-capture group zero or more times
cat      # match 'cat'

仔细想想,我们可以使用所有允许字符的所有数字(直到字符串大小小于6)的所有排列的交替,形成一个不包含'pig'的字符串:dogcat|dogacat|dogbcat| ... |dogaabcat|dogabacat| ... |dogaZrnpiht0xcat|...,但是对于更长的字符串,这在计算上可能有些苛刻。

相关问题