1

I am trying to match everything (backward) from "*" ...baaack... and immediately when first ")" will be find stop.

Example:

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

SELECT
SELECT
SELECT
*** // stop selecting 

I came with this expression:

(?<=\)).+\*

But this selects everything from first ")" until *

4

4 回答 4

3

如果要匹配从最后一个)字符到第一个*字符的所有内容,请使用以下模式:

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

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

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

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

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

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

于 2013-08-14T11:21:02.160 回答
1

让我看看我是否正确理解了这个问题。您想要匹配最后一个右括号 ( )) 和前面的所有内容***
你正在寻找的表达,我认为是这样的:

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

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

array (
    0 => '

      SELECT
      SELECT
      SELECT
      ',
)

这个怎么运作:

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

环顾断言的匹配是零宽度的,并且不会是匹配的一部分。任务完成。
主要的“技巧”是您必须在环视中使用的字符是正则表达式中的特殊字符,并且需要转义,因此\*\)不是简单*)

于 2013-08-14T11:28:04.000 回答
0
\)([^(\))])*$

这个对我有用。

于 2013-08-14T11:27:27.620 回答
0

您可以尝试以下方法:

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

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

于 2013-08-14T11:24:27.533 回答