$key="`client` asc";
preg_match('
~(?J)
\s*
(?:`(?P<col>(?:[^`\\\\]|\\\\.|``)*)`|(?P<col>\S+))
(?:\s+(?P<dir>asc|desc))?
\s*
\z~Axi', $key, $m);
print_r($m);
在此处进行测试时,此正则表达式填充col
键
https://regex101.com/r/i00sEn/1
它在我的本地PHP 5.6
计算机或此7.3
解释程序上无法正常工作。
http://sandbox.onlinephpfunctions.com/code/915a26b741c6d086f21129f60af2420c74cf9f89
如果我删除反引号,那么它在任何地方都有效,但是由于此代码的目的是解析SQL ORDER BY子句,因此我需要反引号。
为什么这样做?如何获得它以正确匹配反引号?
答案 0 :(得分:3)
两个组都交替使用。使用模式可能要做的是创建一个branch reset group Provider.of<int>(context)
而不是一个非捕获组。
由于Wiktor Stribiżew的注释,您的模式可能如下所示:
(?|
答案 1 :(得分:1)
分支重置的替代方法是使用条件
# http://sandbox.onlinephpfunctions.com/code/551b5ecba6d554cdeff616f193fca003cd777014
(?xis-)
\A # BOS
\s*
(?:
( `? ) # (1), Optional backtick
(?<col> # (2 start), Col body
(?(?<= ` ) # Conditional, is backtick behind ?
(?: [^`\\] | \\ . | `` )* # yes, match backtick body
| \S+ # no, match consecutive non-whitespaces
)
) # (2 end)
\1 # Backref to optional backtick
)
(?: # Optional column direction
\s+
(?<dir> asc | desc ) # (3), ascending or descending
)?
\s*
\z # EOS