正则表达式
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 字母或连字符,然后是零个或多个空格和 ]
字符。
我正在研究正则表达式几个小时。 例如,原句为:
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 字母或连字符,然后是零个或多个空格和]
字符。