我试图匹配“*”中的所有内容(向后)... baaack ...并且当第一个“)”将立即停止时。
示例:
teeeext)
text))))
from next line start selecting because this is last ")")
SELECT
SELECT
SELECT
*** // stop selecting
我带着这个表达式来了:
(?<=\)).+\*
但是这会选择从第一个“)”到*
的所有内容答案 0 :(得分:3)
如果您想匹配从上一个)
字符到第一个*
字符的所有内容,请使用以下格式:
(?<=\))[^)*]+\*
[^)*]
表示除 )
或*
之外的任何字符。但这将包括比赛中的第一个*
。如果您希望不要包含*
,请使用前瞻:
(?<=\))[^)*]+(?=\*)
或者,如果您愿意对代码进行一些更改,则可以使用组:
\)([^)*]+)\*
但是你必须做更多的工作才能从比赛中提取这个小组。
答案 1 :(得分:1)
让我看看我是否理解这个问题。您希望匹配最后结束括号()
)后面的所有内容,并在***
之前。
你正在寻找的表达方式,我认为是这样的:
preg_match('/(?<=\))[^)]+(?=\*{3})/m',$text, $matches);
当应用于您的示例字符串时,返回:
array (
0 => '
SELECT
SELECT
SELECT
',
)
工作原理:
(?<=\))
:积极的看法。表达式的其余部分只能匹配,如果它前面有)
[^)]+
:匹配除)
以外的所有内容,这是为了确保lookbehind引用上次关闭)
*
。如果分隔符是三个星号字符,即便如此,如果可以肯定,你可以使这个模式非贪婪:[^\)]+?
。如果结束分隔符可能是单个星号,则应在此类(*
)中包含[)*]+
。(?=\*{3})
:积极向前看。前面的{[\)]+
)只能匹配,前提是***
如果单个*
足以分隔您希望匹配的部分,请将正则表达式更改为/(?=\))[^)]+(?=\*)/
。m
:多行修饰符,因为您的示例是多行字符串,它可能会有用环绕声断言的匹配是零宽度,并且不会成为匹配的一部分。完成工作。
主要的“技巧”是你必须在你的外观中使用的字符是正则表达式中的特殊字符,需要进行转义,因此\*
和\)
而不仅仅是简单的*
和)
答案 2 :(得分:0)
您可以尝试以下内容:
[^)*]+(?=\*)
含义:贪婪地取每个非')'和' - '*'字符直到遇到*。
答案 3 :(得分:0)
\)([^(\))])*$
这个适合我。