坚持一个正则表达式

时间:2013-08-14 11:19:37

标签: php regex

我试图匹配“*”中的所有内容(向后)... baaack ...并且当第一个“)”将立即停止时。

示例:

teeeext)
text))))
from next line start selecting because this is last ")")

SELECT
SELECT
SELECT
*** // stop selecting 

我带着这个表达式来了:

(?<=\)).+\*

但是这会选择从第一个“)”到*

的所有内容

4 个答案:

答案 0 :(得分:3)

如果您想匹配从上一个)字符到第一个*字符的所有内容,请使用以下格式:

(?<=\))[^)*]+\*

[^)*]表示除 )*之外的任何字符。但这将包括比赛中的第一个*。如果您希望不要包含*,请使用前瞻:

(?<=\))[^)*]+(?=\*)

或者,如果您愿意对代码进行一些更改,则可以使用组:

\)([^)*]+)\*

但是你必须做更多的工作才能从比赛中提取这个小组。

答案 1 :(得分:1)

让我看看我是否理解这个问题。您希望匹配最后结束括号())后面的所有内容,并在***之前。
你正在寻找的表达方式,我认为是这样的:

preg_match('/(?<=\))[^)]+(?=\*{3})/m',$text, $matches);

当应用于您的示例字符串时,返回:

array (
    0 => '

      SELECT
      SELECT
      SELECT
      ',
)

工作原理:

  • (?<=\)):积极的看法。表达式的其余部分只能匹配,如果它前面有)
  • [^)]+:匹配除)以外的所有内容,这是为了确保lookbehind引用上次关闭)
    您无需在不匹配的字符中包含*。如果分隔符是三个星号字符,即便如此,如果可以肯定,你可以使这个模式非贪婪:[^\)]+?。如果结束分隔符可能是单个星号,则应在此类(*)中包含[)*]+
  • (?=\*{3}):积极向前看。前面的{[\)]+)只能匹配,前提是*** 如果单个*足以分隔您希望匹配的部分,请将正则表达式更改为/(?=\))[^)]+(?=\*)/
  • m:多行修饰符,因为您的示例是多行字符串,它可能会有用

环绕声断言的匹配是零宽度,并且不会成为匹配的一部分。完成工作。
主要的“技巧”是你必须在你的外观中使用的字符是正则表达式中的特殊字符,需要进行转义,因此\*\)而不仅仅是简单的*)

答案 2 :(得分:0)

您可以尝试以下内容:

[^)*]+(?=\*)

含义:贪婪地取每个非')'和' - '*'字符直到遇到*。

答案 3 :(得分:0)

\)([^(\))])*$

这个适合我。