对于语言学项目,我试图在某些文本中匹配元音之间所有出现的一个或两个辅音。我试图在PHP(preg_match_all
)中编写一个非常简单的匹配器,但是一旦匹配被消耗,它就不能再次匹配。
以下内容非常简单,应该可以解决问题,但只匹配第一次出现:
[aeiou](qu|[bcdfghjklmnprstvwxyz]{1,2})[aeiou]
在:officiosior
:offi
和osi
被返回,但不是ici
,因为尾随i
是第二个匹配的第一部分匹配。
据我所知,这是不可能的,但有没有一个合适的方法解决这个问题?
答案 0 :(得分:8)
您可以使用Positive Lookahead断言来实现此目的。
(?=([aeiou](?:qu|[^aeiou]{1,2})[aeiou]))
前瞻不会消耗字符串上的任何字符。在查看之后,正则表达式引擎返回到它开始查看的字符串上的相同位置。从那里,它可以再次开始匹配......
<强>解释强>:
(?= # look ahead to see if there is:
( # group and capture to \1:
[aeiou] # any character of: 'a', 'e', 'i', 'o', 'u'
(?: # group, but do not capture:
qu # 'qu'
| # OR
[^aeiou]{1,2} # any character except: 'a', 'e', 'i', 'o', 'u'
# (between 1 and 2 times)
) # end of grouping
[aeiou] # any character of: 'a', 'e', 'i', 'o', 'u'
) # end of \1
) # end of look-ahead