Php 从字符串的开头提取s表达式
是否可以使用正则表达式匹配字符串开头的s表达式。就像我有这样的字符串:Php 从字符串的开头提取s表达式,php,regex,Php,Regex,是否可以使用正则表达式匹配字符串开头的s表达式。就像我有这样的字符串: (foo (bar)) "baz" "quux" (foo (bar)) (foo bar) 我想提取 (foo (bar)) 它还应该能够从如下所示的字符串中提取第一个s表达式: (foo (bar)) "baz" "quux" (foo (bar)) (foo bar) 及 是否可以使用regex?如果没有转义序列,您可以使用 ^(\((?>"[^"]*"|[^()]|(?1))*\)) 见 模式匹配:
(foo (bar)) "baz" "quux"
(foo (bar)) (foo bar)
我想提取
(foo (bar))
它还应该能够从如下所示的字符串中提取第一个s表达式:
(foo (bar)) "baz" "quux"
(foo (bar)) (foo bar)
及
是否可以使用regex?如果没有转义序列,您可以使用
^(\((?>"[^"]*"|[^()]|(?1))*\))
见
模式匹配:
-字符串的开头^
-模式将被递归的组1,匹配(\((?>“[^”]*”|[^()]|(?1))*\)
-一个开口\(
(
-零次或多次出现:(?>“[^”]*”|[^()]|(?1))*
-以“[^”]*”
开头的文本,后跟除“
以外的零个或多个字符,并以“
结尾”
-或|
-除[^()]
和(
)
-或|
-整个第1组模式(递归)(?1)
-结账\)
)
注意:如果可以有转义序列,对于正则表达式来说这不是一个好工作。如果将
“[^”]*”
替换为“[^\\”]*(?:\\.\\.^\]*)*”
,效果会更好,但仍然不安全。如果没有转义序列,可以使用
^(\((?>"[^"]*"|[^()]|(?1))*\))
见
模式匹配:
-字符串的开头^
-模式将被递归的组1,匹配(\((?>“[^”]*”|[^()]|(?1))*\)
-一个开口\(
(
-零次或多次出现:(?>“[^”]*”|[^()]|(?1))*
-以“[^”]*”
开头的文本,后跟除“
以外的零个或多个字符,并以“
结尾”
-或|
-除[^()]
和(
)
-或|
-整个第1组模式(递归)(?1)
-结账\)
)
注意:如果可以有转义序列,那么对于正则表达式来说这不是一个好工作。如果将
“[^”]*”
替换为“[^\\”]*(?:\\.\.\[^”\]*)*”
,这会更好,但仍然不安全。更有效的正则表达式:
^(\([^()"]*(?:"[^"]*"[^()"]*)*(?1)*\))
说明:
^ # Asserts beginning of line
( # Start of capturing group (1)
\([^()"]* # A sequence of `(...` up to a double quotation mark or `)`
(?:"[^"]*"[^()"]*)* # Any string within double quotation marks
(?1)* # Recurs a similar sequence of `(...`
\) # End of match
) # End of capturing group (1)
如果@Wiktor在评论中指出的那些模式是有效的,那么这个模式——尽管很长——也能起作用并保持效率:
^(\([^()"]*(?1)*[^()"]*(?:"[^"]*"[^()"]*)*(?1)*\))
(请参见引擎执行的步骤数)更高效的正则表达式:
^(\([^()"]*(?:"[^"]*"[^()"]*)*(?1)*\))
说明:
^ # Asserts beginning of line
( # Start of capturing group (1)
\([^()"]* # A sequence of `(...` up to a double quotation mark or `)`
(?:"[^"]*"[^()"]*)* # Any string within double quotation marks
(?1)* # Recurs a similar sequence of `(...`
\) # End of match
) # End of capturing group (1)
如果@Wiktor在评论中指出的那些模式是有效的,那么这个模式——尽管很长——也能起作用并保持效率:
^(\([^()"]*(?1)*[^()"]*(?:"[^"]*"[^()"]*)*(?1)*\))
(请参阅发动机采取的步骤数)可能吗?是的,这很有效,谢谢。你可以加上这个作为答案。@Jan Force of Habity。也许吧?是的,谢谢。您可以将此添加为答案。@Jan Force of habity.@Jan,在此上下文中,它相当于非捕获组。原子组是那些不允许回溯到它们的组。谈到更“高效”的正则表达式,您可以尝试(但这与
(foo)(“bar”)不匹配)
-如果它是无效的s-expr,那么实际上更好。)@Jan,在这种情况下,它相当于一个非捕获组。原子组是那些不允许回溯到它们的组。说到一个更“高效”的正则表达式,你可以尝试(但这将不匹配(foo”)“bar”)
-如果它是一个无效的s-expr,事实上,这样更好。)它不适用于(foo”)“bar”)
,也不适用于((a)foo(bar))“baz”“quox”
,这是正常的。不平衡。((a)foo(bar))不平衡。((a)foo(bar))
语法不符合模式。它不适用于(foo”)“bar”)
,也不适用于((a)foo(bar))“baz”“quux”
是正常的。不平衡。((a)foo(bar))
不是不平衡。((a)foo(bar))
语法不正常。