正则表达式

regular expression

我正在研究正则表达式几个小时。 例如,原句为:

location in [chambre, cuisine, salle-de-bain, jardin]

只需一步,我想验证形状是 [word, word, word...] 中的单词,我想捕捉每个单词。 (为了性能,我只想一步完成,因为这段代码已经可以三步运行了,但是太长了)

我当前的正则表达式是:

/([a-zA-Z]+)\s+in\s+\[\s*([a-zA-Z-]+)\s*(?:,\s*([a-zA-Z-]+)\s*)*\s*\]/

我抓住了地点、房间和花园。我不喜欢美食和 salle-de-bain

$condition = 'location in [chambre, cuisine, salle-de-bain, jardin]'
$analyse = preg_match('/([a-zA-Z]+)\s+in\s+\[\s*([a-zA-Z-]+)\s*(?:,\s*([a-zA-Z-]+)\s*)*\s*\]/',$condition, $matches);
var_dump($matches);
array:4 [▼
  0 => "location in [chambre, cuisine, salle-de-bain, jardin]"
  1 => "location"
  2 => "chambre"
  3 => "jardin"
]

我没有发现我的正则表达式有什么问题可以捕捉到 2 个缺失的单词。我只得到数组中的第一个和最后一个...

在PHP中,重复捕获组将始终只保留最后捕获的子字符串。

您可以将 preg_match_all

这样的正则表达式一起使用
[a-zA-Z]+(?=\s+in\s+\[\s*[a-zA-Z-]+(?:\s*,\s*[a-zA-Z-]+)*\s*])|(?:\G(?!^)\s*,\s*|(?<=[a-zA-Z])\s+in\s+\[\s*)\K[a-zA-Z-]+(?=(?:\s*,\s*[a-zA-Z-]+)*\s*])

regex demo详情:

  • [a-zA-Z]+(?=\s+in\s+\[\s*[a-zA-Z-]+(?:\s*,\s*[a-zA-Z-]+)*\s*]) - 一个或多个 ASCII 字母,紧跟 in,包含一个或多个空白字符,然后是 [,零个或多个空白,一个或多个 ASCII字母或连字符,然后零个或多个重复的逗号,用零个或多个空格括起来,然后是一个或多个 ASCII 字母或连字符,然后是零个或多个空格和一个 ] char
  • | - 或
  • (?:\G(?!^)\s*,\s*|(?<=[a-zA-Z])\s+in\s+\[\s*)\K[a-zA-Z-]+(?=(?:\s*,\s*[a-zA-Z-]+)*\s*]):
    • (?:\G(?!^)\s*,\s*|(?<=[a-zA-Z])\s+in\s+\[\s*) - 上一场比赛结束,逗号用零个或多个空格括起来,或者一个位置紧跟一个 ASCII 字母,然后是一个或多个空格,in,一个或多个空格,[ 和零个或多个空格
    • \K - 省略目前匹配的文本
    • [a-zA-Z-]+ - 一个或多个 ASCII 字母或连字符
    • (?=(?:\s*,\s*[a-zA-Z-]+)*\s*]) - 正向前瞻,需要重复零次或多次逗号并用零个或多个空格括起来,然后是一个或多个 ASCII 字母或连字符,然后是零个或多个空格和 ] 字符。