Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从字符串的开头提取s表达式_Php_Regex - Fatal编程技术网

Php 从字符串的开头提取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))*\)) 见 模式匹配:

是否可以使用正则表达式匹配字符串开头的s表达式。就像我有这样的字符串:

(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))
语法不正常。