首页 > 解决方案 > 正则表达式中负前瞻运算符的问题

问题描述

我有一个字符串==a==123==b==456==c==879,我想得到字母和数字。

我用 expr 试试这个==(.*?)==(.*?)

这给了我:

 Match 1
    1.  a
    2.   
    Match 2
    1.  b
    2.   
    Match 3
    1.  c
    2.   

...但是数字丢失了。我怎样才能得到它们?

我想得到这个:这给了我:

Match 1
1.  a
2.  123
Match 2
1.  b
2.  456
Match 3
1.  c
2.  789

我相信我必须使用负前瞻运算符,但我不知道在这种情况下它是如何工作的。

(我只是为了这个例子分隔了字母和数字。在实际使用中,我只能分隔==。)

标签: regex

解决方案


您可以告诉正则表达式匹配到==或使用字符串结尾

==(.*?)==(.*?)(?===|$)
==([\s\S]*?)==([\s\S]*?)(?===|$) # To also match line breaks in between ==
(?s)==(.*?)==(.*?)(?===|$)       # Also matches line breaks in between == in PHP and many other flavors but Ruby
(?m)==(.*?)==(.*?)(?===|\Z)      # To also match line breaks in between == in Ruby

请参阅正则表达式演示正则表达式图

在此处输入图像描述

细节

  • ==- 一串两个=字符
  • (.*?)- 第 1 组:除换行符之外的任何 0 个或多个字符,尽可能少
  • ==(.*?)-==组 2 匹配除换行符以外的任何 0 个或多个字符,尽可能少
  • (?===|$)- 一个正向的前瞻,它要求==或字符串的结尾立即位于当前位置的右侧。

推荐阅读