我目前正在使用regexp来提取PHPDoc上面的所有@property
内容。我没有在课堂上定义任何字段,因为我使用了魔法__get()
方法。
我制作了(?<=@property)(.+(?=))((?<= ).+)
regexp(Live example)
但我不能在第一组周围切出空间,所以如果我有类似的东西:
* @property string external_order_id
上面提到的正则表达式我会得到:
完全匹配string external_order_id
第1组string
(注意单词周围的空格)
第2组external_order_id
(没有不必要的空格)
我尝试在第一组(?= )
中使用(.+(?=))
,但在该匹配后停止正则表达式。
答案 0 :(得分:2)
由于.+
捕获了@property
子字符串后面出现的空格(向后(?<=@property)
找到@property
之后的位置,因此空白落在第1组中,并且.
匹配任何字符,但换行符号。)
此外,(?=)
是多余的,因为它需要在当前位置之后的空字符串,即“什么都不做”。
您可以使用
(?m)@property\h*\K(?:(\S+)\h+)?(\S+)$
请参阅regex demo。
模式详情
(?m)
- 一个多行修饰符,使$
匹配一行而不是整个字符串@property
- 文字子字符串\h*
- 0+水平空格\K
- 一个匹配重置运算符,用于丢弃目前为止与Group 0缓冲区匹配的所有文本(?:
- 匹配一系列模式:
(\S+)
- 第1组:一个或多个非空白字符\h+
- 1+个水平空格)?
- 1或0次(\S+)
- 第2组:一个或多个非空白字符$
- 行尾。答案 1 :(得分:2)
由于可能存在没有类型的属性,您必须这样做:
(?m)@property *\K(?>(\S+) *)??(\S+)$
^^
(?m)
设置多行标记(?>...)
构建了一个原子组,用于非捕获目的。??
ungreedy可选量词(但您可以单独使用?
)$
断言行尾现在您熟悉行结束断言,您可以毫无后顾之忧地使用\s
:
(?m)@property\s*\K(?>(\S+)\s*)?(\S+)$